156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 69085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_X64 89dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 921d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 16755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// ----------------------------------------------------------------------------- 17defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of CpuFeatures 18eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 19874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::ProbeImpl(bool cross_compile) { 205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::CPU cpu; 21874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org CHECK(cpu.has_sse2()); // SSE2 support is mandatory. 22874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org CHECK(cpu.has_cmov()); // CMOV support is mandatory. 23c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 24874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org // Only use statically determined features for cross compile (snapshot). 25874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cross_compile) return; 261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 27874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1; 28874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; 291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // SAHF is not generally available in long mode. 30874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (cpu.has_sahf() && FLAG_enable_sahf) supported_|= 1u << SAHF; 3171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 3271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 33defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 34874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::PrintTarget() { } 35874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.orgvoid CpuFeatures::PrintFeatures() { } 36874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 37874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org 38defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// ----------------------------------------------------------------------------- 39defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of RelocInfo 40defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 41defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Patch the code at the current PC with a call to the target address. 42defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Additional guard int3 instructions can be added if required. 43defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int code_size = Assembler::kCallSequenceLength + guard_bytes; 454af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 464af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Create a code patcher. 474af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org CodePatcher patcher(pc_, code_size); 484af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 494af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Add a label for checking the size of the code used for returning. 504af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#ifdef DEBUG 514af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org Label check_codesize; 524af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->bind(&check_codesize); 534af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#endif 544af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 554af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Patch the code. 56fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org patcher.masm()->movp(kScratchRegister, reinterpret_cast<void*>(target), 57fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org Assembler::RelocInfoNone()); 583c12eb14bac172c26c619fd306c89b98034f3f24bmeurer@chromium.org patcher.masm()->call(kScratchRegister); 594af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 604af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Check that the size of the code generated is as expected. 61e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(Assembler::kCallSequenceLength, 624af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 63defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 64defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // Add the requested number of int3 instructions after the call. 65defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org for (int i = 0; i < guard_bytes; i++) { 664af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->int3(); 67defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 68defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 69defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 70defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 71911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 72911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Patch the code at the current address with the supplied instructions. 73911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org for (int i = 0; i < instruction_count; i++) { 74911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org *(pc_ + i) = *(instructions + i); 75911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 764af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 774af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Indicate that code has changed. 785de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CpuFeatures::FlushICache(pc_, instruction_count); 79911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 80911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 81c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 82c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// ----------------------------------------------------------------------------- 83c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Register constants. 84c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 85a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgconst int 86a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Register::kRegisterCodeByAllocationIndex[kMaxNumAllocatableRegisters] = { 87935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org // rax, rbx, rdx, rcx, rsi, rdi, r8, r9, r11, r14, r15 88935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 0, 3, 2, 1, 6, 7, 8, 9, 11, 14, 15 89c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}; 90c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgconst int Register::kAllocationIndexByRegisterCode[kNumRegisters] = { 92935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 0, 3, 2, 1, -1, -1, 4, 5, 6, 7, -1, 8, -1, -1, 9, 10 93c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}; 94c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 95c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 96defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// ----------------------------------------------------------------------------- 97defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of Operand 98defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 995c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Register base, int32_t disp) : rex_(0) { 100defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org len_ = 1; 101defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (base.is(rsp) || base.is(r12)) { 102defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // SIB byte is needed to encode (rsp + offset) or (r12 + offset). 103defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_sib(times_1, rsp, base); 104defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 105defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 106defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (disp == 0 && !base.is(rbp) && !base.is(r13)) { 107defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(0, base); 108defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else if (is_int8(disp)) { 109defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(1, base); 110defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp8(disp); 111defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else { 112defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(2, base); 113defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp32(disp); 114defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 115defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 116defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 117defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 118defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgOperand::Operand(Register base, 119defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org Register index, 120defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org ScaleFactor scale, 1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org int32_t disp) : rex_(0) { 122e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(rsp)); 123defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org len_ = 1; 124defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_sib(scale, index, base); 125defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (disp == 0 && !base.is(rbp) && !base.is(r13)) { 126defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // This call to set_modrm doesn't overwrite the REX.B (or REX.X) bits 127defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // possibly set by set_sib. 128defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(0, rsp); 129defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else if (is_int8(disp)) { 130defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(1, rsp); 131defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp8(disp); 132defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else { 133defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(2, rsp); 134defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp32(disp); 135defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 136defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 137defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 138defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1395c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Register index, 1405c838251403b0be9a882540f1922577abba4c872ager@chromium.org ScaleFactor scale, 1415c838251403b0be9a882540f1922577abba4c872ager@chromium.org int32_t disp) : rex_(0) { 142e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(rsp)); 1435c838251403b0be9a882540f1922577abba4c872ager@chromium.org len_ = 1; 1445c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_modrm(0, rsp); 1455c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_sib(scale, index, rbp); 1465c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_disp32(disp); 1475c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1485c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1495c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgOperand::Operand(const Operand& operand, int32_t offset) { 151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand.len_ >= 1); 1529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Operand encodes REX ModR/M [SIB] [Disp]. 1539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org byte modrm = operand.buf_[0]; 154e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(modrm < 0xC0); // Disallow mode 3 (register target). 1559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org bool has_sib = ((modrm & 0x07) == 0x04); 1569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org byte mode = modrm & 0xC0; 1579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int disp_offset = has_sib ? 2 : 1; 1589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int base_reg = (has_sib ? operand.buf_[1] : modrm) & 0x07; 1599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 0 with rbp/r13 as ModR/M or SIB base register always has a 32-bit 1609155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // displacement. 1619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org bool is_baseless = (mode == 0) && (base_reg == 0x05); // No base or RIP base. 1629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int32_t disp_value = 0; 1639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (mode == 0x80 || is_baseless) { 1649155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 2 or mode 0 with rbp/r13 as base: Word displacement. 165e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org disp_value = *bit_cast<const int32_t*>(&operand.buf_[disp_offset]); 1669155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else if (mode == 0x40) { 1679155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 1: Byte displacement. 1689155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org disp_value = static_cast<signed char>(operand.buf_[disp_offset]); 1699155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 1709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 1719155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Write new operand with same registers, but with modified displacement. 172e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset >= 0 ? disp_value + offset > disp_value 1739155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org : disp_value + offset < disp_value); // No overflow. 1749155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org disp_value += offset; 1759155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org rex_ = operand.rex_; 1769155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (!is_int8(disp_value) || is_baseless) { 1779155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need 32 bits of displacement, mode 2 or mode 1 with register rbp/r13. 1789155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f) | (is_baseless ? 0x00 : 0x80); 1799155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset + 4; 1809155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org Memory::int32_at(&buf_[disp_offset]) = disp_value; 1819155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else if (disp_value != 0 || (base_reg == 0x05)) { 1829155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need 8 bits of displacement. 1839155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f) | 0x40; // Mode 1. 1849155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset + 1; 1859155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[disp_offset] = static_cast<byte>(disp_value); 1869155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else { 1879155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need no displacement. 1889155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f); // Mode 0. 1899155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset; 1909155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 1919155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (has_sib) { 1929155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[1] = operand.buf_[1]; 1939155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 1949155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} 1959155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 1960ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 1970ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgbool Operand::AddressUsesRegister(Register reg) const { 1980ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int code = reg.code(); 199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((buf_[0] & 0xC0) != 0xC0); // Always a memory operand. 2000ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Start with only low three bits of base register. Initial decoding doesn't 2010ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // distinguish on the REX.B bit. 2020ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int base_code = buf_[0] & 0x07; 2030ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rsp.code()) { 2040ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // SIB byte present in buf_[1]. 2050ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Check the index register from the SIB byte + REX.X prefix. 2060ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int index_code = ((buf_[1] >> 3) & 0x07) | ((rex_ & 0x02) << 2); 2070ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Index code (including REX.X) of 0x04 (rsp) means no index register. 2080ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (index_code != rsp.code() && index_code == code) return true; 2090ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Add REX.B to get the full base register code. 2100ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org base_code = (buf_[1] & 0x07) | ((rex_ & 0x01) << 3); 2110ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // A base register of 0x05 (rbp) with mod = 0 means no base register. 2120ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; 2130ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return code == base_code; 2140ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 2150ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // A base register with low bits of 0x05 (rbp or r13) and mod = 0 means 2160ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // no base register. 2170ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; 2180ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org base_code |= ((rex_ & 0x01) << 3); 2190ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return code == base_code; 2200ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 2210ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 2220ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 2230ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 22471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// ----------------------------------------------------------------------------- 2255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Implementation of Assembler. 22671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 22771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef GENERATED_CODE_COVERAGE 22871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void InitCoverageLog(); 22971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 23071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 2318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 2328e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : AssemblerBase(isolate, buffer, buffer_size), 233ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_targets_(100), 234e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org positions_recorder_(this) { 23571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Clear the buffer in debug mode unless it was provided by the 23671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // caller in which case we can't be sure it's okay to overwrite 237a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // existing code in it. 23871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef DEBUG 23971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (own_buffer_) { 2408e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org memset(buffer_, 0xCC, buffer_size_); // int3 24171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 24271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 24371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 2448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 24571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 246f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 24771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef GENERATED_CODE_COVERAGE 24871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org InitCoverageLog(); 24971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 25071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 25171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 25271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 25371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::GetCode(CodeDesc* desc) { 2545c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Finalize code (at this point overflow() may be true, but the gap ensures 2555c838251403b0be9a882540f1922577abba4c872ager@chromium.org // that we are still not overlapping instructions and relocation info). 256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap. 257f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up code descriptor. 25871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->buffer = buffer_; 25971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->buffer_size = buffer_size_; 26071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->instr_size = pc_offset(); 261e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(desc->instr_size > 0); // Zero-size code objects upset the system. 262c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org desc->reloc_size = 263c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); 26471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->origin = this; 26571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 26671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 26771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 26871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::Align(int m) { 26921d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org DCHECK(base::bits::IsPowerOfTwo32(m)); 27040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org int delta = (m - (pc_offset() & (m - 1))) & (m - 1); 27164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Nop(delta); 272b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 273b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 274b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 2755ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgvoid Assembler::CodeTargetAlign() { 2765ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org Align(16); // Preferred alignment of jump targets on x64. 2775ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 2785ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2795ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 28064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool Assembler::IsNop(Address addr) { 28164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Address a = addr; 28264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (*a == 0x66) a++; 28364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (*a == 0x90) return true; 28464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (a[0] == 0xf && a[1] == 0x1f) return true; 28564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return false; 28664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 28764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 28864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 289755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::bind_to(Label* L, int pos) { 290e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!L->is_bound()); // Label may only be bound once. 291e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= pos && pos <= pc_offset()); // Position must be valid. 292755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_linked()) { 293755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int current = L->pos(); 294755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int next = long_at(current); 295755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org while (next != current) { 2965c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relative address, relative to point after address. 297755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int imm32 = pos - (current + sizeof(int32_t)); 298755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org long_at_put(current, imm32); 299755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org current = next; 300755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org next = long_at(next); 301755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 302755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Fix up last fixup on linked list. 303755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int last_imm32 = pos - (current + sizeof(int32_t)); 304755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org long_at_put(current, last_imm32); 305755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 30683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org while (L->is_near_linked()) { 30783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int fixup_pos = L->near_link_pos(); 30883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset_to_next = 30983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset_to_next <= 0); 31183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int disp = pos - (fixup_pos + sizeof(int8_t)); 3129c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.org CHECK(is_int8(disp)); 31383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org set_byte_at(fixup_pos, disp); 31483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (offset_to_next < 0) { 31583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(fixup_pos + offset_to_next, Label::kNear); 31683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else { 31783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->UnuseNear(); 31883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 31983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 320755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->bind_to(pos); 321b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 322b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 323b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 324755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::bind(Label* L) { 325755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org bind_to(L, pc_offset()); 326b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 327b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 328755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 32971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::GrowBuffer() { 330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(buffer_overflow()); 33171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (!own_buffer_) FATAL("external code buffer is too small"); 33271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 3335c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Compute new buffer size. 33471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CodeDesc desc; // the new buffer 3359d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org desc.buffer_size = 2 * buffer_size_; 3369d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 33771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Some internal data structures overflow for very large buffers, 33871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // they must ensure that kMaximalBufferSize is not too large. 33971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if ((desc.buffer_size > kMaximalBufferSize) || 340c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) { 34171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 34271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 343b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 344f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up new buffer. 34571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.buffer = NewArray<byte>(desc.buffer_size); 34671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.instr_size = pc_offset(); 347c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org desc.reloc_size = 348c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>((buffer_ + buffer_size_) - (reloc_info_writer.pos())); 349b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 35071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Clear the buffer in debug mode. Use 'int3' instructions to make 35171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // sure to get into problems if we ever run uninitialized code. 35271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef DEBUG 35371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org memset(desc.buffer, 0xCC, desc.buffer_size); 35471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 355b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3565c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Copy the data. 3573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t pc_delta = desc.buffer - buffer_; 3583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t rc_delta = (desc.buffer + desc.buffer_size) - 3593e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org (buffer_ + buffer_size_); 360d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(desc.buffer, buffer_, desc.instr_size); 361d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(), 362d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org desc.reloc_size); 363b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3645c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Switch buffers. 3659d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org DeleteArray(buffer_); 36671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org buffer_ = desc.buffer; 36771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org buffer_size_ = desc.buffer_size; 36871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org pc_ += pc_delta; 36971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 37071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org reloc_info_writer.last_pc() + pc_delta); 371b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3725c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relocate runtime entries. 37371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org for (RelocIterator it(desc); !it.done(); it.next()) { 37471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org RelocInfo::Mode rmode = it.rinfo()->rmode(); 3753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org if (rmode == RelocInfo::INTERNAL_REFERENCE) { 3763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t* p = reinterpret_cast<intptr_t*>(it.rinfo()->pc()); 37771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (*p != 0) { // 0 means uninitialized. 37871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org *p += pc_delta; 37971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 38071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 38171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 382b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!buffer_overflow()); 384b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 385b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 386b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::emit_operand(int code, const Operand& adr) { 388e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint3(code)); 38971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const unsigned length = adr.len_; 390e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length > 0); 391b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 392e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Emit updated ModR/M byte containing the given register. 393e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((adr.buf_[0] & 0x38) == 0); 3945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org pc_[0] = adr.buf_[0] | code << 3; 395b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 39671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Emit the rest of the encoded operand. 39771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 39871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org pc_ += length; 399b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 400b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 401b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4025c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Assembler Instruction implementations. 403755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 4042f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::arithmetic_op(byte opcode, 4052f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Register reg, 4062f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org const Operand& op, 4072f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int size) { 40871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 4092f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(reg, op, size); 410755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(opcode); 411755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(reg, op); 412b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 413b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 414b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4152f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::arithmetic_op(byte opcode, 4162f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Register reg, 4172f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Register rm_reg, 4182f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int size) { 41971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 420e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((opcode & 0xC6) == 2); 4219dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (rm_reg.low_bits() == 4) { // Forces SIB byte. 4229dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 4232f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(rm_reg, reg, size); 4249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode ^ 0x02); 4259dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 4269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 4272f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(reg, rm_reg, size); 4289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 4299dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 4309dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 431755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 432755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 4335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 434911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op_16(byte opcode, Register reg, Register rm_reg) { 4355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((opcode & 0xC6) == 2); 4379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (rm_reg.low_bits() == 4) { // Forces SIB byte. 4389dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 4399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x66); 4409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(rm_reg, reg); 4419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode ^ 0x02); 4429dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 4439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 4449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x66); 4459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(reg, rm_reg); 4469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 4479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 4489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 449911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 450911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 451911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 452911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op_16(byte opcode, 453911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Register reg, 454911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const Operand& rm_reg) { 455911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 456911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); 457911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(reg, rm_reg); 458911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(opcode); 459911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(reg, rm_reg); 460911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 461911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 462911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 4632f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::arithmetic_op_8(byte opcode, Register reg, const Operand& op) { 4642f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org EnsureSpace ensure_space(this); 4652f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org if (!reg.is_byte_register()) { 4662f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 4672f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex_32(reg); 4682f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org } 4692f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit(opcode); 4702f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_operand(reg, op); 4712f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org} 4722f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 4732f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org 4742f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::arithmetic_op_8(byte opcode, Register reg, Register rm_reg) { 475911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 476e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((opcode & 0xC6) == 2); 4772f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org if (rm_reg.low_bits() == 4) { // Forces SIB byte. 4789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 4792f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org if (!rm_reg.is_byte_register() || !reg.is_byte_register()) { 4802f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 4812f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex_32(rm_reg, reg); 4822f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org } 4832f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit(opcode ^ 0x02); 4849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 4859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 4862f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org if (!reg.is_byte_register() || !rm_reg.is_byte_register()) { 4872f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 4882f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex_32(reg, rm_reg); 4892f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org } 4909dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 4919dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 4929dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 4935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 4945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 4955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 496755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op(byte subcode, 497755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org Register dst, 4982f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Immediate src, 4992f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int size) { 500755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 5012f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(dst, size); 502755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (is_int8(src.value_)) { 503755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x83); 504e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 505755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(src.value_); 506755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (dst.is(rax)) { 507755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x05 | (subcode << 3)); 508755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 509755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 510755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x81); 511e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 512755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 513755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 514755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 515755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 516755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op(byte subcode, 517755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const Operand& dst, 5182f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Immediate src, 5192f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int size) { 520755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 5212f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(dst, size); 522755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (is_int8(src.value_)) { 523755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x83); 524eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 525755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(src.value_); 526755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 527755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x81); 528eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 529755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 530755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 531755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 532755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 533755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 534911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op_16(byte subcode, 535911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Register dst, 536911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Immediate src) { 537911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 538911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); // Operand size override prefix. 539911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 540911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_int8(src.value_)) { 541911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x83); 542911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_modrm(subcode, dst); 543911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(src.value_); 544911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else if (dst.is(rax)) { 545911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x05 | (subcode << 3)); 5463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 547911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 548911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x81); 549911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_modrm(subcode, dst); 5503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 551911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 552911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 553911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 554911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 555911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op_16(byte subcode, 556911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const Operand& dst, 557911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Immediate src) { 558911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 559911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); // Operand size override prefix. 560911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 561911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_int8(src.value_)) { 562911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x83); 563911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(subcode, dst); 564911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(src.value_); 565911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 566911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x81); 567911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(subcode, dst); 5683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 569911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 570911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 571911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 572911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 573eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::immediate_arithmetic_op_8(byte subcode, 5743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org const Operand& dst, 5753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Immediate src) { 576eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 577eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_optional_rex_32(dst); 578e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(src.value_) || is_uint8(src.value_)); 579eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x80); 580eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 581eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(src.value_); 582eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 583eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 584eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 5853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::immediate_arithmetic_op_8(byte subcode, 5863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Register dst, 5873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Immediate src) { 5883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 58956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 5902f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 5912f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex_32(dst); 5923e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org } 593e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(src.value_) || is_uint8(src.value_)); 5943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x80); 5953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(subcode, dst); 5963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(src.value_); 5973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 5983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 5993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 6002f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::shift(Register dst, 6012f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org Immediate shift_amount, 6022f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int subcode, 6032f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org int size) { 604e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 605e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(size == kInt64Size ? is_uint6(shift_amount.value_) 6062f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org : is_uint5(shift_amount.value_)); 607e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (shift_amount.value_ == 1) { 6082f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(dst, size); 609e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xD1); 610e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 611e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 6122f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(dst, size); 613e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC1); 614e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 615e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(shift_amount.value_); 616e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 617e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 618e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 619e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 6202f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid Assembler::shift(Register dst, int subcode, int size) { 621e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 6222f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org emit_rex(dst, size); 623e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xD3); 624e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 625e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 626e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 627e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 628e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::bt(const Operand& dst, Register src) { 629e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 630e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 631e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 632e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA3); 633e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 634e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 635e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 636e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 637e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::bts(const Operand& dst, Register src) { 638e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 639e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 640e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 641e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAB); 642e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 643e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 644e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 645e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid Assembler::bsrl(Register dst, Register src) { 647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org EnsureSpace ensure_space(this); 648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org emit_optional_rex_32(dst, src); 649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org emit(0x0F); 650f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org emit(0xBD); 651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org emit_modrm(dst, src); 652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 655755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::call(Label* L) { 656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 657755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 6585c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 659755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE8); 660755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 661755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offset = L->pos() - pc_offset() - sizeof(int32_t); 662e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset <= 0); 663755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(offset); 664755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (L->is_linked()) { 665755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 666755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(pc_offset() - sizeof(int32_t)); 667755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 668e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(L->is_unused()); 669755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 670755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 671755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 672755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 673b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 674b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 675b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 6766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::call(Address entry, RelocInfo::Mode rmode) { 677e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsRuntimeEntry(rmode)); 6786e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org positions_recorder()->WriteRecordedPositions(); 6796e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 6806e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org // 1110 1000 #32-bit disp. 6816e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0xE8); 6826e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 6836e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 6846e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 6856e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 6868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid Assembler::call(Handle<Code> target, 6878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org RelocInfo::Mode rmode, 688471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId ast_id) { 689f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 690c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 6915c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 692c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0xE8); 6938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org emit_code_target(target, rmode, ast_id); 694c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 695c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 696c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 697e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::call(Register adr) { 698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 699e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 7005c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: FF /2 r64. 70140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(adr); 702e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 703e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x2, adr); 704e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 705e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 706e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 707e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::call(const Operand& op) { 708a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 709e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 7105c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: FF /2 m64. 71140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(op); 712e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 71340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_operand(0x2, op); 714e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 715e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 716e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 71783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Calls directly to the given address using a relative offset. 71883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Should only ever be used in Code objects for calls within the 71983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// same Code object. Should not be used when generating new code (use labels), 72083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// but only when patching existing code. 72183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid Assembler::call(Address target) { 72283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org positions_recorder()->WriteRecordedPositions(); 72383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org EnsureSpace ensure_space(this); 72483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // 1110 1000 #32-bit disp. 72583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0xE8); 72683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org Address source = pc_ + 4; 72783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org intptr_t displacement = target - source; 728e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int32(displacement)); 72983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emitl(static_cast<int32_t>(displacement)); 73083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 73183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 73283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 7339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::clc() { 7349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 7359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xF8); 7369d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 7379d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 738e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7397979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::cld() { 7407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EnsureSpace ensure_space(this); 7417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org emit(0xFC); 7427979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 7437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 744e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7450b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid Assembler::cdq() { 7460b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org EnsureSpace ensure_space(this); 7470b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org emit(0x99); 7480b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org} 7490b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 7500b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 7513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovq(Condition cc, Register dst, Register src) { 7529d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 7539d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movq(dst, src); 7549d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 7559d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 7569d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 7573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // No need to check CpuInfo for CMOV support, it's a required part of the 7583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // 64-bit architecture. 759e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cc >= 0); // Use mov for unconditional moves. 7603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 7615c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: REX.W 0f 40 + cc /r. 7623e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 7633e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 7643e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 7653e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(dst, src); 7663e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 7673e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 7683e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 7693e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovq(Condition cc, Register dst, const Operand& src) { 7709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 7719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movq(dst, src); 7729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 7739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 7749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 775e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cc >= 0); 7763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 7775c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: REX.W 0f 40 + cc /r. 7783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 7793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 7803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 7813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 7823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 7833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 7843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 7853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovl(Condition cc, Register dst, Register src) { 7869d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 7879d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movl(dst, src); 7889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 7899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 7909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 791e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cc >= 0); 7923e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 7935c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: 0f 40 + cc /r. 7943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 7953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 7963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 7973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(dst, src); 7983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 7993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8003e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8013e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovl(Condition cc, Register dst, const Operand& src) { 8029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 8039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movl(dst, src); 8049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 8059d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 8069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 807e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cc >= 0); 8083e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 8095c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: 0f 40 + cc /r. 8103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 8113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 8123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 8133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 8143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 8153e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8163e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 817911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::cmpb_al(Immediate imm8) { 818e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(imm8.value_) || is_uint8(imm8.value_)); 819911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 820911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x3c); 821911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(imm8.value_); 822911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 823911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 8243e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 825eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::cpuid() { 826eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 827eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x0F); 828eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xA2); 829eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 830eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 831eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 832e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::cqo() { 833e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 834e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(); 835e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x99); 836e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 837e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 838e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 8397a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_dec(Register dst, int size) { 84071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 8417a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, size); 842e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit(0xFF); 843e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit_modrm(0x1, dst); 844e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org} 845e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 846e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 8477a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_dec(const Operand& dst, int size) { 848eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 8497a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, size); 850eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xFF); 851eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(1, dst); 852eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 853eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 854eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 8559d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::decb(Register dst) { 8569d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 85756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 8589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Register is not one of al, bl, cl, dl. Its encoding needs REX. 8599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_rex_32(dst); 8609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 8619d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xFE); 8629d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_modrm(0x1, dst); 8639d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 8649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 8659d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 8669d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::decb(const Operand& dst) { 8679d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 8689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_optional_rex_32(dst); 8699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xFE); 8709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_operand(1, dst); 8719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 8729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 8739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 874e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::enter(Immediate size) { 875e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 876e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC8); 877e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emitw(size.value_); // 16 bit operand, always. 878e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0); 879e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 880e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 881e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 88271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::hlt() { 88371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 884755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF4); 885b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 886b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 887b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 888fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid Assembler::emit_idiv(Register src, int size) { 889e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 890fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org emit_rex(src, size); 891e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xF7); 892e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x7, src); 893e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 894e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 895e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 8967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::emit_div(Register src, int size) { 8977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 8987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_rex(src, size); 8997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit(0xF7); 9007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_modrm(0x6, src); 9017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 9027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 9037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 904fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid Assembler::emit_imul(Register src, int size) { 9050b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org EnsureSpace ensure_space(this); 906fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org emit_rex(src, size); 9072abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org emit(0xF7); 9082abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org emit_modrm(0x5, src); 9092abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 9102abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 9112abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 912fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid Assembler::emit_imul(Register dst, Register src, int size) { 9135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 914fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org emit_rex(dst, src, size); 9155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x0F); 9165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xAF); 9175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(dst, src); 9185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 9195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 9205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 921fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid Assembler::emit_imul(Register dst, const Operand& src, int size) { 922e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 923fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org emit_rex(dst, src, size); 924e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 925e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAF); 926e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 927e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 928e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 929e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 930fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid Assembler::emit_imul(Register dst, Register src, Immediate imm, int size) { 931e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 932fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org emit_rex(dst, src, size); 933cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org if (is_int8(imm.value_)) { 934cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x6B); 935cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_modrm(dst, src); 936cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(imm.value_); 937cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } else { 938cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x69); 939cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_modrm(dst, src); 940cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emitl(imm.value_); 941cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 942cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} 943cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 944cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 9457a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_inc(Register dst, int size) { 94671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 9477a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, size); 948755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 949e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, dst); 950b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 951b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 952b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 9537a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_inc(const Operand& dst, int size) { 954eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 9557a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, size); 956eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xFF); 957eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(0, dst); 958eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 959eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 960eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 96171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::int3() { 96271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 963755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xCC); 964b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 965b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 966b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 9677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 9689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 9699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com jmp(L); 9709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 9719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 9729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 9739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 974755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 975e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint4(cc)); 976755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 977755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const int short_size = 2; 978755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const int long_size = 6; 979755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offs = L->pos() - pc_offset(); 980e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 981000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // Determine whether we can use 1-byte offsets for backwards branches, 982000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // which have a max range of 128 bytes. 983000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 984e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // We also need to check predictable_code_size() flag here, because on x64, 985e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // when the full code generator recompiles code for debugging, some places 986e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // need to be padded out to a certain size. The debugger is keeping track of 987e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // how often it did this so that it can adjust return addresses on the 988e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // stack, but if the size of jump instructions can also change, that's not 989e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // enough and the calculated offsets would be incorrect. 990e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (is_int8(offs - short_size) && !predictable_code_size()) { 9915c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0111 tttn #8-bit disp. 992755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x70 | cc); 993755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit((offs - short_size) & 0xFF); 994755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 9955c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 996755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 997755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 998755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(offs - long_size); 999755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 100083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 100183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // 0111 tttn #8-bit disp 100283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(0x70 | cc); 100383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org byte disp = 0x00; 100483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (L->is_near_linked()) { 100583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset = L->near_link_pos() - pc_offset(); 1006e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(offset)); 100783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org disp = static_cast<byte>(offset & 0xFF); 100883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 100983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(pc_offset(), Label::kNear); 101083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(disp); 1011755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (L->is_linked()) { 10125c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1013755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 1014755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 1015755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 1016755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(pc_offset() - sizeof(int32_t)); 1017755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 1018e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(L->is_unused()); 1019755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 1020755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 1021755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 1022755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 1023755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 1024755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1025755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1026755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1027755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 10286e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::j(Condition cc, Address entry, RelocInfo::Mode rmode) { 1029e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsRuntimeEntry(rmode)); 10306e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 1031e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint4(cc)); 10326e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0x0F); 10336e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0x80 | cc); 10346e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 10356e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 10366e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 10376e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1038c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid Assembler::j(Condition cc, 1039c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Handle<Code> target, 1040c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org RelocInfo::Mode rmode) { 1041c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 1042e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint4(cc)); 10435c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1044c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0x0F); 1045c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0x80 | cc); 1046c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit_code_target(target, rmode); 1047c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 1048c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1049c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 105083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid Assembler::jmp(Label* L, Label::Distance distance) { 1051755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1052c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org const int short_size = sizeof(int8_t); 1053c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org const int long_size = sizeof(int32_t); 1054755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 1055755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offs = L->pos() - pc_offset() - 1; 1056e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 1057e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (is_int8(offs - short_size) && !predictable_code_size()) { 10585c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1011 #8-bit disp. 1059755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xEB); 1060c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org emit((offs - short_size) & 0xFF); 1061755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 10625c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1063755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1064c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org emitl(offs - long_size); 1065755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 106683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 106783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(0xEB); 106883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org byte disp = 0x00; 106983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (L->is_near_linked()) { 107083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset = L->near_link_pos() - pc_offset(); 1071e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(offset)); 107283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org disp = static_cast<byte>(offset & 0xFF); 107383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 107483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(pc_offset(), Label::kNear); 107583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(disp); 107683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (L->is_linked()) { 10775c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1078755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1079755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 1080c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org L->link_to(pc_offset() - long_size); 1081755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 10825c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1083e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(L->is_unused()); 1084755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1085755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 1086755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 1087755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 1088755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1089755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1090755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1091755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1092c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid Assembler::jmp(Handle<Code> target, RelocInfo::Mode rmode) { 1093c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 10945c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1095c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0xE9); 1096c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit_code_target(target, rmode); 1097c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 1098c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1099c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 11006e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::jmp(Address entry, RelocInfo::Mode rmode) { 1101e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsRuntimeEntry(rmode)); 11026e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 1103e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsRuntimeEntry(rmode)); 11046e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0xE9); 11056e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 11066e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 11076e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 11086e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1109e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::jmp(Register target) { 1110e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 11115c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode FF/4 r64. 111240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(target); 1113e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 1114e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x4, target); 1115e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1116e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1117e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1118911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::jmp(const Operand& src) { 1119911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 11205c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode FF/4 m64. 1121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(src); 1122911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0xFF); 1123911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(0x4, src); 1124911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1125911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1126911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1127895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_lea(Register dst, const Operand& src, int size) { 1128e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1129895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(dst, src, size); 1130cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x8D); 1131cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_operand(dst, src); 1132cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} 1133cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1134cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1135e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::load_rax(void* value, RelocInfo::Mode mode) { 1136e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 11375c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (kPointerSize == kInt64Size) { 11385c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0x48); // REX.W 11395c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0xA1); 11405c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitp(value, mode); 11415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } else { 1142e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kPointerSize == kInt32Size); 11435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0xA1); 11445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitp(value, mode); 11455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // In 64-bit mode, need to zero extend the operand to 8 bytes. 11465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // See 2.2.1.4 in Intel64 and IA32 Architectures Software 11475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // Developer's Manual Volume 2. 11485c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitl(0); 11495c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 1150e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1151e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1152e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1153e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::load_rax(ExternalReference ref) { 1154e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org load_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE); 1155e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1156e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1157e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1158e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::leave() { 1159e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1160e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC9); 1161e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1162e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1163e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1164e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(Register dst, const Operand& src) { 1165e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 116656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 1167a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1168a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(dst, src); 1169a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } else { 1170a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_optional_rex_32(dst, src); 1171a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1172e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x8A); 1173e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1174e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1175e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1176cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1177e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(Register dst, Immediate imm) { 1178e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 117956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 11802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1181a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(dst); 1182a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1183a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit(0xB0 + dst.low_bits()); 1184e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(imm.value_); 1185e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1186e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1187cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1188e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(const Operand& dst, Register src) { 1189e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 119056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!src.is_byte_register()) { 11912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1192a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(src, dst); 1193a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } else { 1194a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_optional_rex_32(src, dst); 1195a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1196e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x88); 1197e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 1198e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1199e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1200cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1201e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movb(const Operand& dst, Immediate imm) { 1202e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1203e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst); 1204e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xC6); 1205e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(0x0, dst); 1206e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_)); 1207e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1208e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1209e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1210e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movw(Register dst, const Operand& src) { 1211e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1212e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x66); 1213e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst, src); 1214e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x8B); 1215e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(dst, src); 1216e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1217e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1218e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 12193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movw(const Operand& dst, Register src) { 12203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 12213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x66); 12223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_optional_rex_32(src, dst); 12233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x89); 12243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(src, dst); 12253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 12263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 1227cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1228e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movw(const Operand& dst, Immediate imm) { 1229e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1230e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x66); 1231e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst); 1232e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xC7); 1233e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(0x0, dst); 1234e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_ & 0xff)); 1235e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_ >> 8)); 1236e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1237e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1238e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1239ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, const Operand& src, int size) { 1240e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1241ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, src, size); 1242e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x8B); 1243e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1244e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1245e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1246e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1247ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, Register src, int size) { 1248e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 12499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 1250ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(src, dst, size); 12519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x89); 12529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 12539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 1254ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, src, size); 12559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x8B); 12569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 12579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 1258e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1259e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1260e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1261ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(const Operand& dst, Register src, int size) { 1262e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1263ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(src, dst, size); 1264e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x89); 1265e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 1266e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1267e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1268e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1269ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, Immediate value, int size) { 1270e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1271ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, size); 1272ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (size == kInt64Size) { 1273ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(0xC7); 1274ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_modrm(0x0, dst); 12759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 1276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(size == kInt32Size); 1277ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(0xB8 + dst.low_bits()); 12789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 1279ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(value); 1280755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1281755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1282755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1283ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(const Operand& dst, Immediate value, int size) { 1284755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1285ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, size); 1286755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC7); 1287ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_operand(0x0, dst); 1288ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(value); 1289e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1290e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1291e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 12929cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.orgvoid Assembler::movp(Register dst, void* value, RelocInfo::Mode rmode) { 12939cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org EnsureSpace ensure_space(this); 12949cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org emit_rex(dst, kPointerSize); 12959cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org emit(0xB8 | dst.low_bits()); 12969cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org emitp(value, rmode); 1297755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1298755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1299755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1300e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movq(Register dst, int64_t value) { 1301e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1302e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_rex_64(dst); 1303e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xB8 | dst.low_bits()); 1304e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emitq(value); 1305e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1306e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1307e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1308ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::movq(Register dst, uint64_t value) { 1309ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org movq(dst, static_cast<int64_t>(value)); 1310eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1311eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1312eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 13135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Loads the ip-relative location of the src label into the target location 13145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (as a 32-bit offset sign extended to 64-bit). 1315911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::movl(const Operand& dst, Label* src) { 1316911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 1317911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 1318911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0xC7); 1319911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(0, dst); 1320911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (src->is_bound()) { 1321911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int offset = src->pos() - pc_offset() - sizeof(int32_t); 1322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset <= 0); 1323911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(offset); 1324911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else if (src->is_linked()) { 1325911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(src->pos()); 1326911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org src->link_to(pc_offset() - sizeof(int32_t)); 1327911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 1328e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(src->is_unused()); 1329911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int32_t current = pc_offset(); 1330911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(current); 1331911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org src->link_to(current); 1332911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1333911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1334911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1335911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 13362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Assembler::movsxbl(Register dst, const Operand& src) { 13372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EnsureSpace ensure_space(this); 13382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit_optional_rex_32(dst, src); 13392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit(0x0F); 13402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit(0xBE); 13412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit_operand(dst, src); 13422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org} 13432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 13442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 13453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsxbq(Register dst, const Operand& src) { 13463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 134732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org emit_rex_64(dst, src); 13483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x0F); 13493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xBE); 13503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(dst, src); 13513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 13523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 13533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 13542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Assembler::movsxwl(Register dst, const Operand& src) { 13552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org EnsureSpace ensure_space(this); 13562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit_optional_rex_32(dst, src); 13572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit(0x0F); 13582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit(0xBF); 13592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org emit_operand(dst, src); 13602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org} 13612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 13622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 13633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsxwq(Register dst, const Operand& src) { 13643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 13653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_rex_64(dst, src); 13663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x0F); 13673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xBF); 13683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(dst, src); 13693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 13703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 13713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 13725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::movsxlq(Register dst, Register src) { 13735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 13745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_rex_64(dst, src); 13755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x63); 13765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(dst, src); 13775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 13785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 13795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 13803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsxlq(Register dst, const Operand& src) { 13813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 13823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 13833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x63); 13843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 13853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 13863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 13873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 1388895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_movzxb(Register dst, const Operand& src, int size) { 13895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 1390f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // 32 bit operations zero the top 32 bits of 64 bit registers. Therefore 1391f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // there is no need to make this a 64 bit operation. 139232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org emit_optional_rex_32(dst, src); 13935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x0F); 13945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xB6); 13955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(dst, src); 13965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 13975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 13985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 13997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::emit_movzxb(Register dst, Register src, int size) { 14007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 14017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // 32 bit operations zero the top 32 bits of 64 bit registers. Therefore 14027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // there is no need to make this a 64 bit operation. 14032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (!src.is_byte_register()) { 14042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 14052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org emit_rex_32(dst, src); 14062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } else { 14072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org emit_optional_rex_32(dst, src); 14082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 14097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit(0x0F); 14107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit(0xB6); 14117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_modrm(dst, src); 14127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 14137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 14147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1415895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_movzxw(Register dst, const Operand& src, int size) { 14165a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 1417895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // 32 bit operations zero the top 32 bits of 64 bit registers. Therefore 1418895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // there is no need to make this a 64 bit operation. 14195a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_optional_rex_32(dst, src); 14205a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0x0F); 14215a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0xB7); 14225a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_operand(dst, src); 14235a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com} 14245a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 14255a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 1426895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_movzxw(Register dst, Register src, int size) { 142746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org EnsureSpace ensure_space(this); 1428895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // 32 bit operations zero the top 32 bits of 64 bit registers. Therefore 1429895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org // there is no need to make this a 64 bit operation. 143046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit_optional_rex_32(dst, src); 143146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit(0x0F); 143246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit(0xB7); 143346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit_modrm(dst, src); 143446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 143546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 143646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 1437b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsb() { 1438b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1439b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1440b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA4); 1441b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1442b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1443b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1444b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsw() { 1445b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1446b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0x66); // Operand size override. 1447b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1448b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA4); 1449b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1450b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1451b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1452895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_repmovs(int size) { 1453b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1454b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1455895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(size); 1456b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA5); 1457b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1458b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1459b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1460e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::mul(Register src) { 1461e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1462e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src); 1463e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xF7); 1464e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x4, src); 1465e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1466e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1467e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 14687a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_neg(Register dst, int size) { 14694af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org EnsureSpace ensure_space(this); 14707a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, size); 14714af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit(0xF7); 14724af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit_modrm(0x3, dst); 14734af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org} 14744af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 14754af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 14767a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_neg(const Operand& dst, int size) { 1477755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1478755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1479755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1480755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(3, dst); 1481b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1482b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1483b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 148471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::nop() { 148571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1486755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x90); 1487755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1488755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1489755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1490895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_not(Register dst, int size) { 1491755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1492895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(dst, size); 1493755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1494e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x2, dst); 1495b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1496b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1497755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1498895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_not(const Operand& dst, int size) { 1499755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1500895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(dst, size); 1501755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1502755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(2, dst); 1503755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1504755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1505755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 150664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::Nop(int n) { 1507e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // The recommended muti-byte sequences of NOP instructions from the Intel 64 1508e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // and IA-32 Architectures Software Developer's Manual. 1509e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 1510e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Length Assembly Byte Sequence 1511e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 2 bytes 66 NOP 66 90H 1512e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 3 bytes NOP DWORD ptr [EAX] 0F 1F 00H 1513e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H 1514e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H 1515e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H 1516e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H 1517e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H 1518e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 66 0F 1F 84 00 00 00 00 1519e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 00000000H] 00H 1520e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1521e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 152264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (n > 0) { 152364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org switch (n) { 152464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 2: 152564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 152664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 1: 152764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x90); 152864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 152964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 3: 153064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 153164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 153264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 153364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 153464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 4: 153564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 153664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 153764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x40); 153864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 153964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 154064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 6: 154164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 154264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 5: 154364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 154464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 154564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x44); 154664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 154764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 154864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 154964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 7: 155064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 155164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 155264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x80); 155364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 155464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 155564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 155664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 155764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 155864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org default: 155964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 11: 156064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 156164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 156264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 10: 156364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 156464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 156564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 9: 156664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 156764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 156864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 8: 156964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 157064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 157164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x84); 157264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 157364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 157464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 157564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 157664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 157764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n -= 8; 157864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org } 1579e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1580e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1581e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1582e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1583763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::popq(Register dst) { 158471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 158540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst); 15865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x58 | dst.low_bits()); 1587b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1588b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1589b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1590763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::popq(const Operand& dst) { 159171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 159240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst); 1593755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x8F); 1594755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(0, dst); 1595b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1596b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1597b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1598e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::popfq() { 1599e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1600e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x9D); 1601e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1602e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1603e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1604763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::pushq(Register src) { 160571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 160640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(src); 16075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x50 | src.low_bits()); 1608b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1609b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1610b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1611763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::pushq(const Operand& src) { 161271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 161340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(src); 1614755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 1615755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(6, src); 1616b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1617b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1618b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1619763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::pushq(Immediate value) { 1620e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1621e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (is_int8(value.value_)) { 1622e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x6A); 1623e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(value.value_); // Emit low byte of value. 1624e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 1625e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x68); 1626e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emitl(value.value_); 1627e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1628e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1629e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1630e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1631763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::pushq_imm32(int32_t imm32) { 16320ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 16330ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x68); 16340ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emitl(imm32); 16350ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 16360ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 16370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 1638e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::pushfq() { 1639e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1640e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x9C); 1641eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1642eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1643e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 164471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::ret(int imm16) { 164571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1646e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint16(imm16)); 164771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (imm16 == 0) { 1648755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC3); 164971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else { 1650755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC2); 1651755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(imm16 & 0xFF); 1652755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit((imm16 >> 8) & 0xFF); 1653755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1654755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1655755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1656755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1657eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::setcc(Condition cc, Register reg) { 16589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc > last_condition) { 16599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movb(reg, Immediate(cc == always ? 1 : 0)); 16609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 16619d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 1662eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 1663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint4(cc)); 16642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (!reg.is_byte_register()) { 16652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1666eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_rex_32(reg); 1667eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 1668eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x0F); 1669eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x90 | cc); 1670eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_modrm(0x0, reg); 1671eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1672eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1673eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1674e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shld(Register dst, Register src) { 1675e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1676e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 1677e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 1678e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA5); 1679e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(src, dst); 1680e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1681e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1682e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1683e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shrd(Register dst, Register src) { 1684e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1685e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 1686e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 1687e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAD); 1688e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(src, dst); 1689e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1690e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1691e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1692895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid Assembler::emit_xchg(Register dst, Register src, int size) { 1693c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org EnsureSpace ensure_space(this); 1694c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org if (src.is(rax) || dst.is(rax)) { // Single-byte encoding 1695c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org Register other = src.is(rax) ? dst : src; 1696895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(other, size); 1697c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x90 | other.low_bits()); 1698c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else if (dst.low_bits() == 4) { 1699895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(dst, src, size); 1700c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x87); 1701c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_modrm(dst, src); 1702c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else { 1703895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org emit_rex(src, dst, size); 1704c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x87); 1705c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_modrm(src, dst); 1706c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 1707c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 1708c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 1709c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 17107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid Assembler::emit_xchg(Register dst, const Operand& src, int size) { 17117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org EnsureSpace ensure_space(this); 17127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_rex(dst, src, size); 17137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit(0x87); 17147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org emit_operand(dst, src); 17157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 17167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 17177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1718e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::store_rax(void* dst, RelocInfo::Mode mode) { 1719e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 17205c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (kPointerSize == kInt64Size) { 17215c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0x48); // REX.W 17225c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0xA3); 17235c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitp(dst, mode); 17245c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } else { 1725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kPointerSize == kInt32Size); 17265c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emit(0xA3); 17275c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitp(dst, mode); 17285c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // In 64-bit mode, need to zero extend the operand to 8 bytes. 17295c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // See 2.2.1.4 in Intel64 and IA32 Architectures Software 17305c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org // Developer's Manual Volume 2. 17315c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org emitl(0); 17325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org } 1733e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1734e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1735e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1736e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::store_rax(ExternalReference ref) { 1737e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org store_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE); 1738e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1739e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1740e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 17419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::testb(Register dst, Register src) { 17429d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 17439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 17449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_32(src, dst); 17459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x84); 17469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 17479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 174856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register() || !src.is_byte_register()) { 17499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Register is not one of al, bl, cl, dl. Its encoding needs REX. 17509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_32(dst, src); 17519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 17529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x84); 17539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 17549d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 17559d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 17569d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 17579d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 1758755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testb(Register reg, Immediate mask) { 1759e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(mask.value_) || is_uint8(mask.value_)); 1760755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1761755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (reg.is(rax)) { 1762755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xA8); 176368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org emit(mask.value_); // Low byte emitted. 1764755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 176556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!reg.is_byte_register()) { 1766e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1767e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_32(reg); 1768755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1769755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF6); 1770e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, reg); 1771755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask.value_); // Low byte emitted. 1772755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1773755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1774755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1775755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1776755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testb(const Operand& op, Immediate mask) { 1777e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_int8(mask.value_) || is_uint8(mask.value_)); 1778755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1779755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_optional_rex_32(rax, op); 1780755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF6); 1781755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(rax, op); // Operation code 0 1782755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask.value_); // Low byte emitted. 1783755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1784755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1785755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1786b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::testb(const Operand& op, Register reg) { 1787b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 178856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!reg.is_byte_register()) { 1789b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1790b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_rex_32(reg, op); 1791b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 1792b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_optional_rex_32(reg, op); 1793b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 1794b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0x84); 1795b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_operand(reg, op); 1796b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1797b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1798b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 17997a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_test(Register dst, Register src, int size) { 180068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org EnsureSpace ensure_space(this); 18019dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 18027a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(src, dst, size); 18039dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 18049dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 18059dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 18067a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(dst, src, size); 18079dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 18089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 18099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 181068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org} 181168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 181268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 18137a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_test(Register reg, Immediate mask, int size) { 1814911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // testl with a mask that fits in the low byte is exactly testb. 1815911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_uint8(mask.value_)) { 1816911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org testb(reg, mask); 1817911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return; 1818911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1819755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1820755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (reg.is(rax)) { 18217a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(rax, size); 1822755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xA9); 1823755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 1824755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 18257a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(reg, size); 1826755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1827e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, reg); 1828755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 1829755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1830755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1831755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1832755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 18337a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_test(const Operand& op, Immediate mask, int size) { 1834911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // testl with a mask that fits in the low byte is exactly testb. 1835911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_uint8(mask.value_)) { 1836911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org testb(op, mask); 1837911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return; 1838911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1839755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 18407a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(rax, op, size); 1841755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1842755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(rax, op); // Operation code 0 1843755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 1844755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1845755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1846755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 18477a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.orgvoid Assembler::emit_test(const Operand& op, Register reg, int size) { 1848c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org EnsureSpace ensure_space(this); 18497a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org emit_rex(reg, op, size); 1850c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x85); 1851c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_operand(reg, op); 1852c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 1853c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 1854c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 18555c838251403b0be9a882540f1922577abba4c872ager@chromium.org// FPU instructions. 18565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld(int i) { 18595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 18605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xD9, 0xC0, i); 18615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 18625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld1() { 18655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 18665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 18675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE8); 18685aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 18695aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fldz() { 18725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 18735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 18745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xEE); 18755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 18765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1878ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::fldpi() { 1879ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 1880ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xD9); 1881ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xEB); 1882ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 1883ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 1884ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 1885a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fldln2() { 1886a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 1887a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xD9); 1888a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xED); 1889a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1890a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1891a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 18925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld_s(const Operand& adr) { 18935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 189486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 18955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 18965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 18975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 18985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 18995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld_d(const Operand& adr) { 19015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 190286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDD); 19045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 19055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fstp_s(const Operand& adr) { 19095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 191086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 19125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 19135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fstp_d(const Operand& adr) { 19175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 191886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDD); 19205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 19215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fstp(int index) { 1925e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint3(index)); 19263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 19273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_farith(0xDD, 0xD8, index); 19283811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 19293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 19303811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 19315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fild_s(const Operand& adr) { 19325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 193386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 19355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 19365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fild_d(const Operand& adr) { 19405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 194186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 19435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(5, adr); 19445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19455aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fistp_s(const Operand& adr) { 19485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 194986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19505aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 19515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 19525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fisttp_s(const Operand& adr) { 1956e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 19575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 195886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 19605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(1, adr); 19615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1964b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::fisttp_d(const Operand& adr) { 1965e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 1966b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1967b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_optional_rex_32(adr); 1968b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xDD); 1969b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_operand(1, adr); 1970b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1971b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1972b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 19735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fist_s(const Operand& adr) { 19745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 197586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 19775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(2, adr); 19785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fistp_d(const Operand& adr) { 19825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 198386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 19845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 19853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(7, adr); 19865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fabs() { 19905aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 19915aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 19925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE1); 19935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 19945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 19965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fchs() { 19975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 19985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 19995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE0); 20005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fcos() { 20045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 20065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFF); 20075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsin() { 20115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 20135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFE); 20145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid Assembler::fptan() { 20181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org EnsureSpace ensure_space(this); 20191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org emit(0xD9); 20201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org emit(0xF2); 20211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org} 20221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 20231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 2024a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fyl2x() { 2025a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xD9); 2027a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xF1); 2028a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2029a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2030a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 203164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::f2xm1() { 203264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 203364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xD9); 203464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xF0); 203564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 203664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 203764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 203864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fscale() { 203964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 204064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xD9); 204164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xFD); 204264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 204364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 204464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 204564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fninit() { 204664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 204764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xDB); 204864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xE3); 204964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 205064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 205164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 20525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fadd(int i) { 20535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xC0, i); 20555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsub(int i) { 20595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xE8, i); 20615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fisub_s(const Operand& adr) { 20655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 206686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 20675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDA); 20685aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(4, adr); 20695aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fmul(int i) { 20735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xC8, i); 20755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fdiv(int i) { 20795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xF8, i); 20815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::faddp(int i) { 20855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xC0, i); 20875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20905aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsubp(int i) { 20915aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xE8, i); 20935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsubrp(int i) { 20975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xE0, i); 20995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fmulp(int i) { 21035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xC8, i); 21055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fdivp(int i) { 21095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xF8, i); 21115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fprem() { 21155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF8); 21185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fprem1() { 21225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF5); 21255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fxch(int i) { 21295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xD9, 0xC8, i); 21315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fincstp() { 21355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF7); 21385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::ffree(int i) { 21425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDD, 0xC0, i); 21445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21455aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::ftst() { 21485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21505aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE4); 21515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fucomp(int i) { 21555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDD, 0xE8, i); 21575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fucompp() { 21615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDA); 21635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE9); 21645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomi(int i) { 21683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 21693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xDB); 21703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xE8 + i); 21713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 21723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomip() { 21753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 21763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xDF); 21773811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xE9); 21783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 21793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fcompp() { 21825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDE); 21845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fnstsw_ax() { 21895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21905aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 21915aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE0); 21925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fwait() { 21965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 21975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x9B); 21985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::frndint() { 22025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 22045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFC); 22055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fnclex() { 22095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 22115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE2); 22125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22153e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::sahf() { 22163e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // TODO(X64): Test for presence. Not all 64-bit intel CPU's have sahf 22173e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // in 64-bit mode. Test CpuID. 2218e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SAHF)); 22193e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 22203e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x9E); 22213e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 22223e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 22233e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 22245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::emit_farith(int b1, int b2, int i) { 2225e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2226e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint3(i)); // illegal stack offset 22275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(b1); 22285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(b2 + i); 22295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 2231e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2232ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org// SSE operations. 2233ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2234ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.orgvoid Assembler::andps(XMMRegister dst, XMMRegister src) { 2235ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org EnsureSpace ensure_space(this); 2236ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit_optional_rex_32(dst, src); 2237ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit(0x0F); 2238ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit(0x54); 2239ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit_sse_operand(dst, src); 2240ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org} 2241ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2242ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2243af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andps(XMMRegister dst, const Operand& src) { 2244af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2245af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2246af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2247af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x54); 2248af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2249af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2250af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2251af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2252057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Assembler::orps(XMMRegister dst, XMMRegister src) { 2253057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2254057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_optional_rex_32(dst, src); 2255057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x0F); 2256057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x56); 2257057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2258057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2259057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2260057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2261af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orps(XMMRegister dst, const Operand& src) { 2262af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2263af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2264af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2265af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x56); 2266af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2267af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2268af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2269af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2270057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Assembler::xorps(XMMRegister dst, XMMRegister src) { 2271057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2272057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_optional_rex_32(dst, src); 2273057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x0F); 2274057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x57); 2275057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2276057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2277057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2278057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2279af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::xorps(XMMRegister dst, const Operand& src) { 2280af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2281af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2282af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2283af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x57); 2284af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2285af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2286af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2287af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2288af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, XMMRegister src) { 2289af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2290af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2291af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2292af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x58); 2293af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2294af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2295af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2296af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2297af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, const Operand& src) { 2298af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2299af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2300af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2301af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x58); 2302af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2303af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2304af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2305af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2306af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, XMMRegister src) { 2307af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2308af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2309af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2310af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5C); 2311af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2312af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2313af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2314af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2315af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, const Operand& src) { 2316af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2317af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2318af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2319af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5C); 2320af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2321af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2322af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2323af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2324af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, XMMRegister src) { 2325af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2326af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2327af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2328af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x59); 2329af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2330af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2331af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2332af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2333af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, const Operand& src) { 2334af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2335af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2336af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2337af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x59); 2338af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2339af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2340af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2341af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2342af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, XMMRegister src) { 2343af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2344af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2345af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2346af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5E); 2347af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2348af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2349af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2350af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2351af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, const Operand& src) { 2352af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2353af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2354af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2355af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5E); 2356af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2357af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2358af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2359af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 23605c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SSE 2 operations. 23613e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2362357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Assembler::movd(XMMRegister dst, Register src) { 2363357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org EnsureSpace ensure_space(this); 2364357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x66); 2365357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_optional_rex_32(dst, src); 2366357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x0F); 2367357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x6E); 2368357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_sse_operand(dst, src); 2369357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 2370357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2371357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2372ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movd(Register dst, XMMRegister src) { 2373ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2374ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2375e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_optional_rex_32(src, dst); 2376ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2377ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x7E); 2378e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_sse_operand(src, dst); 2379ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2380ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2381ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2382ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movq(XMMRegister dst, Register src) { 2383ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2384ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2385ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit_rex_64(dst, src); 2386ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2387ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x6E); 2388ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit_sse_operand(dst, src); 2389ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2390ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2391ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2392ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movq(Register dst, XMMRegister src) { 2393ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2394ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2395e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_rex_64(src, dst); 2396ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2397ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x7E); 2398e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_sse_operand(src, dst); 2399ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2400ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2401ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2402160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movq(XMMRegister dst, XMMRegister src) { 2403160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2404160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (dst.low_bits() == 4) { 2405160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Avoid unnecessary SIB byte. 2406160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0xf3); 2407160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2408160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2409160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x7e); 2410160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2411160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2412160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2413160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2414160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2415160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0xD6); 2416160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2417160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2418160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2419160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2420e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 24210ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgvoid Assembler::movdqa(const Operand& dst, XMMRegister src) { 24220ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 24230ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x66); 24240ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_rex_64(src, dst); 24250ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x0F); 24260ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x7F); 24270ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_sse_operand(src, dst); 24280ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 24290ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 24300ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 24310ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgvoid Assembler::movdqa(XMMRegister dst, const Operand& src) { 24320ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 24330ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x66); 24340ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_rex_64(dst, src); 24350ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x0F); 24360ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x6F); 24370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_sse_operand(dst, src); 24380ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 24390ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 24400ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 2441e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Assembler::movdqu(const Operand& dst, XMMRegister src) { 2442e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EnsureSpace ensure_space(this); 2443e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0xF3); 2444e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_rex_64(src, dst); 2445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x0F); 2446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x7F); 2447e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_sse_operand(src, dst); 2448e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2449e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Assembler::movdqu(XMMRegister dst, const Operand& src) { 2452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EnsureSpace ensure_space(this); 2453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0xF3); 2454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_rex_64(dst, src); 2455e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x0F); 2456e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x6F); 2457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_sse_operand(dst, src); 2458e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2461ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) { 2462e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 2463e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 2464ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2465ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2466b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org emit_optional_rex_32(src, dst); 2467ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2468ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x3A); 2469ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x17); 2470b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org emit_sse_operand(src, dst); 2471ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(imm8); 2472ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2473ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2474ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 24753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsd(const Operand& dst, XMMRegister src) { 24763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 24773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 24783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(src, dst); 24793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 24803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x11); // store 24813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(src, dst); 24823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 24833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsd(XMMRegister dst, XMMRegister src) { 24863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 24873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 24883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 24893e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 24903e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x10); // load 24913e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 24923e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 24933e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsd(XMMRegister dst, const Operand& src) { 24963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 24973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 24983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 24993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 25003e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x10); // load 25013e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 25023e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 25033e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 25043e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2505160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movaps(XMMRegister dst, XMMRegister src) { 2506160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2507160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (src.low_bits() == 4) { 2508160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Try to avoid an unnecessary SIB byte. 2509160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2510160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2511160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x29); 2512160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2513160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2514160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2515160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2516160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x28); 2517160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2518160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2519160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2520160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2521160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2522af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) { 2523e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 2524af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2525af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(src, dst); 2526af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2527af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0xC6); 2528af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2529af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(imm8); 2530af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2531af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2532af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2533160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movapd(XMMRegister dst, XMMRegister src) { 2534160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2535160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (src.low_bits() == 4) { 2536160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Try to avoid an unnecessary SIB byte. 2537160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2538160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2539160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2540160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x29); 2541160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2542160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2543160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2544160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2545160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2546160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x28); 2547160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2548160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2549160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2550160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2551160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 255240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::movss(XMMRegister dst, const Operand& src) { 255340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 255440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); // single 255540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 255640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 255740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x10); // load 255840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 255940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 256040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 256140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 256240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::movss(const Operand& src, XMMRegister dst) { 256340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 256440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); // single 256540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 256640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 256740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x11); // store 256840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 256940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 257040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 257140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2572ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid Assembler::psllq(XMMRegister reg, byte imm8) { 2573ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org EnsureSpace ensure_space(this); 2574ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org emit(0x66); 2575ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org emit(0x0F); 2576ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org emit(0x73); 2577ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org emit_sse_operand(rsi, reg); // rsi == 6 2578ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org emit(imm8); 2579ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2580ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2581ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 25823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvttss2si(Register dst, const Operand& src) { 25833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 25843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF3); 25853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 25863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 25873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2C); 25883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 25893e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 25903e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 25913e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 25920a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid Assembler::cvttss2si(Register dst, XMMRegister src) { 25930a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org EnsureSpace ensure_space(this); 25940a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0xF3); 25950a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_optional_rex_32(dst, src); 25960a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x0F); 25970a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x2C); 25980a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_sse_operand(dst, src); 25990a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 26000a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 26010a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 26023e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvttsd2si(Register dst, const Operand& src) { 26033e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 26043e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 26053e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 26063e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 26073e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2C); 26083e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 26093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 26103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26120a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid Assembler::cvttsd2si(Register dst, XMMRegister src) { 26130a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org EnsureSpace ensure_space(this); 26140a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0xF2); 26150a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_optional_rex_32(dst, src); 26160a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x0F); 26170a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x2C); 26180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_sse_operand(dst, src); 26190a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 26200a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 26210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 2622dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgvoid Assembler::cvttsd2siq(Register dst, XMMRegister src) { 2623dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org EnsureSpace ensure_space(this); 2624dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0xF2); 2625dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit_rex_64(dst, src); 2626dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0x0F); 2627dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0x2C); 2628dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit_sse_operand(dst, src); 2629dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org} 2630dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 2631dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 2632a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid Assembler::cvttsd2siq(Register dst, const Operand& src) { 2633a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org EnsureSpace ensure_space(this); 2634a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit(0xF2); 2635a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit_rex_64(dst, src); 2636a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit(0x0F); 2637a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit(0x2C); 2638a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit_sse_operand(dst, src); 2639a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 2640a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2641a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 26423e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtlsi2sd(XMMRegister dst, const Operand& src) { 26433e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 26443e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 26453e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 26463e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 26473e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 26483e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 26493e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 26503e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtlsi2sd(XMMRegister dst, Register src) { 26533e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 26543e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 26553e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 26563e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 26573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 26583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 26593e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 26603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26613e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 266240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtlsi2ss(XMMRegister dst, Register src) { 266340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 266440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); 266540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 266640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 266740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2A); 266840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 266940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 267040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 267140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 26723e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtqsi2sd(XMMRegister dst, Register src) { 26733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 26743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 26753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 26763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 26773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 26783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 26793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 26803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 26813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2682357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { 2683357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org EnsureSpace ensure_space(this); 2684357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0xF3); 2685357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_optional_rex_32(dst, src); 2686357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x0F); 2687357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x5A); 2688357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_sse_operand(dst, src); 2689357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 2690357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2691357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 269240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, const Operand& src) { 269340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 269440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); 269540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 269640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 269740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x5A); 269840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 269940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 270040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 270140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 270240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { 270340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 270440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 270540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 270640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 270740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x5A); 270840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 270940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 271040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 271140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 271240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2si(Register dst, XMMRegister src) { 271340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 271440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 271540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 271640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 271740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2D); 271840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 271940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 272040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 272140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 272240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2siq(Register dst, XMMRegister src) { 272340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 272440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 272540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_rex_64(dst, src); 272640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 272740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2D); 272840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 272940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 273040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 273140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 27323e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::addsd(XMMRegister dst, XMMRegister src) { 27333e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27343e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 27353e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27363e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27373e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x58); 27383e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27421f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::addsd(XMMRegister dst, const Operand& src) { 27431f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 27441f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0xF2); 27451f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_optional_rex_32(dst, src); 27461f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x0F); 27471f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x58); 27481f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 27491f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 27501f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 27511f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 27523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) { 27533e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27543e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 27553e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27563e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x59); 27583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27593e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27613e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27621f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::mulsd(XMMRegister dst, const Operand& src) { 27631f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 27641f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0xF2); 27651f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_optional_rex_32(dst, src); 27661f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x0F); 27671f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x59); 27681f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 27691f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 27701f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 27711f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 27723e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::subsd(XMMRegister dst, XMMRegister src) { 27733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 27753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x5C); 27783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::divsd(XMMRegister dst, XMMRegister src) { 27833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 27853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x5E); 27883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27893e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27903e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27913e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27925d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.orgvoid Assembler::andpd(XMMRegister dst, XMMRegister src) { 27935d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org EnsureSpace ensure_space(this); 27945d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x66); 27955d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_optional_rex_32(dst, src); 27965d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x0F); 27975d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x54); 27985d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_sse_operand(dst, src); 27995d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org} 28005d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 28015d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 28025d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.orgvoid Assembler::orpd(XMMRegister dst, XMMRegister src) { 28035d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org EnsureSpace ensure_space(this); 28045d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x66); 28055d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_optional_rex_32(dst, src); 28065d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x0F); 28075d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x56); 28085d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_sse_operand(dst, src); 28095d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org} 28105d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 28115d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 28125c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::xorpd(XMMRegister dst, XMMRegister src) { 28135c838251403b0be9a882540f1922577abba4c872ager@chromium.org EnsureSpace ensure_space(this); 28145c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x66); 28155c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_optional_rex_32(dst, src); 28164111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x0F); 2817160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x57); 2818160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2819160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2820160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2821160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 28224111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { 28234111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org EnsureSpace ensure_space(this); 28244111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0xF2); 28254111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit_optional_rex_32(dst, src); 28264111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x0F); 28274111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x51); 28284111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit_sse_operand(dst, src); 28294111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org} 28304111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 28314111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 28327e6132b924829c353864933f29124419916db550machenbach@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, const Operand& src) { 28337e6132b924829c353864933f29124419916db550machenbach@chromium.org EnsureSpace ensure_space(this); 28347e6132b924829c353864933f29124419916db550machenbach@chromium.org emit(0xF2); 28357e6132b924829c353864933f29124419916db550machenbach@chromium.org emit_optional_rex_32(dst, src); 28367e6132b924829c353864933f29124419916db550machenbach@chromium.org emit(0x0F); 28377e6132b924829c353864933f29124419916db550machenbach@chromium.org emit(0x51); 28387e6132b924829c353864933f29124419916db550machenbach@chromium.org emit_sse_operand(dst, src); 28397e6132b924829c353864933f29124419916db550machenbach@chromium.org} 28407e6132b924829c353864933f29124419916db550machenbach@chromium.org 28417e6132b924829c353864933f29124419916db550machenbach@chromium.org 28425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, XMMRegister src) { 28435c838251403b0be9a882540f1922577abba4c872ager@chromium.org EnsureSpace ensure_space(this); 28445c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x66); 28455c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_optional_rex_32(dst, src); 28465c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x0f); 28475c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x2e); 28485c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_sse_operand(dst, src); 28495c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 28505c838251403b0be9a882540f1922577abba4c872ager@chromium.org 28513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 285240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) { 285340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 285440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x66); 285540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 285640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0f); 285740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2e); 285840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 285940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 286040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 286140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 28621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { 28631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org EnsureSpace ensure_space(this); 28641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0xF2); 28651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit_optional_rex_32(dst, src); 28661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0x0F); 28671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0xC2); 28681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit_sse_operand(dst, src); 28691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0x01); // LT == 1 28701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 28711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 28721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2873160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, 2874160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Assembler::RoundingMode mode) { 2875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE4_1)); 2876160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2877160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2878160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2879160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0f); 2880160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x3a); 2881160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0b); 2882160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2883160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Mask precision exeption. 2884160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(static_cast<byte>(mode) | 0x8); 2885160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2886160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2887160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 288883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid Assembler::movmskpd(Register dst, XMMRegister src) { 288983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org EnsureSpace ensure_space(this); 289083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x66); 289183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit_optional_rex_32(dst, src); 289283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x0f); 289383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x50); 289483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit_sse_operand(dst, src); 289583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 289683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 289740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 28984121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.orgvoid Assembler::movmskps(Register dst, XMMRegister src) { 28994121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org EnsureSpace ensure_space(this); 29004121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit_optional_rex_32(dst, src); 29014121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit(0x0f); 29024121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit(0x50); 29034121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit_sse_operand(dst, src); 29044121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org} 29054121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 29064121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 29073e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 29083e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Register ireg = { reg.code() }; 29093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(ireg, adr); 29103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2913a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid Assembler::emit_sse_operand(Register reg, const Operand& adr) { 2914a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Register ireg = {reg.code()}; 2915a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org emit_operand(ireg, adr); 2916a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 2917a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2918a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 29193e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { 292086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 29213e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29223e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2923e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 29243e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) { 292586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 29263e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29273e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2928e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2929ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) { 2930ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 2931ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2932ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 29335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 29340511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comvoid Assembler::db(uint8_t data) { 29350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com EnsureSpace ensure_space(this); 29360511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com emit(data); 29370511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 29380511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 29390511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 2940a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::dd(uint32_t data) { 2941a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2942a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emitl(data); 2943a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2944a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2945a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 29465c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Relocation information implementations. 2947755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2948755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2949e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsNone(rmode)); 2950874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org // Don't record external references unless the heap will be serialized. 2951874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org if (rmode == RelocInfo::EXTERNAL_REFERENCE && 2952874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org !serializer_enabled() && !emit_debug_code()) { 2953874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org return; 2954c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else if (rmode == RelocInfo::CODE_AGE_SEQUENCE) { 2955c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Don't record psuedo relocation info for code age sequence mode. 2956c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return; 295771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 2958c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RelocInfo rinfo(pc_, rmode, data, NULL); 2959755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org reloc_info_writer.Write(&rinfo); 2960755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 2961755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2962e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2963755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::RecordJSReturn() { 2964f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 2965755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 2966755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org RecordRelocInfo(RelocInfo::JS_RETURN); 2967b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 2968b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 2969755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 29702356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgvoid Assembler::RecordDebugBreakSlot() { 2971f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 29722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org EnsureSpace ensure_space(this); 29732356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 29742356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 29752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 29762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 29773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid Assembler::RecordComment(const char* msg, bool force) { 29783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (FLAG_code_comments || force) { 2979755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 2980755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 2981755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 2982755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 2983755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2984755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 29859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgHandle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) { 2986763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org // No out-of-line constant pool support. 2987e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 29889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return isolate->factory()->empty_constant_pool_array(); 2989763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org} 2990763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2991763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2992763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgvoid Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { 2993763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org // No out-of-line constant pool support. 2994e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 29959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return; 2996763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org} 2997763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2998763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org 2999c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgconst int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | 30006e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1 << RelocInfo::RUNTIME_ENTRY | 3001e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1 << RelocInfo::INTERNAL_REFERENCE | 3002e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1 << RelocInfo::CODE_AGE_SEQUENCE; 3003755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 30049dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 30059dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.combool RelocInfo::IsCodedSpecially() { 30069dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // The deserializer needs to know whether a pointer is specially coded. Being 30079dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // specially coded on x64 means that it is a relative 32 bit address, as used 30089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // by branch instructions. 30099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com return (1 << rmode_) & kApplyMask; 30109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 30119dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 3012bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 3013bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool RelocInfo::IsInConstantPool() { 3014bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return false; 3015bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 3016bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 3017bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 301871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} } // namespace v8::internal 30199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 30209dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_X64 3021