156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 25ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// Redistribution and use in source and binary forms, with or without 35ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// modification, are permitted provided that the following conditions are 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// met: 55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// 65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Redistributions of source code must retain the above copyright 75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// notice, this list of conditions and the following disclaimer. 85ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Redistributions in binary form must reproduce the above 95ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// copyright notice, this list of conditions and the following 105ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// disclaimer in the documentation and/or other materials provided 115ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// with the distribution. 125ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Neither the name of Google Inc. nor the names of its 135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// contributors may be used to endorse or promote products derived 145ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// from this software without specific prior written permission. 155ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// 165ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "v8.h" 299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 3093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_X64 319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "macro-assembler.h" 33755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org#include "serialize.h" 349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 38755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// ----------------------------------------------------------------------------- 39defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of CpuFeatures 40eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 41c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 42c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#ifdef DEBUG 43c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgbool CpuFeatures::initialized_ = false; 44c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#endif 45c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orguint64_t CpuFeatures::supported_ = CpuFeatures::kDefaultCpuFeatures; 46750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orguint64_t CpuFeatures::found_by_runtime_probing_only_ = 0; 4763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.orguint64_t CpuFeatures::cross_compile_ = 0; 48b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 49003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgExternalReference ExternalReference::cpu_features() { 50003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org ASSERT(CpuFeatures::initialized_); 51003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org return ExternalReference(&CpuFeatures::supported_); 52003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org} 53003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 54003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 55c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgvoid CpuFeatures::Probe() { 56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(supported_ == CpuFeatures::kDefaultCpuFeatures); 57c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#ifdef DEBUG 58c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org initialized_ = true; 59c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#endif 60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org supported_ = kDefaultCpuFeatures; 61c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (Serializer::enabled()) { 62c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org supported_ |= OS::CpuFeaturesImpliedByPlatform(); 63c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return; // No features if we might serialize. 64c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 65e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org uint64_t probed_features = 0; 671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org CPU cpu; 681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (cpu.has_sse41()) { 691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org probed_features |= static_cast<uint64_t>(1) << SSE4_1; 70c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (cpu.has_sse3()) { 721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org probed_features |= static_cast<uint64_t>(1) << SSE3; 73c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 74c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // SSE2 must be available on every x64 CPU. 761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ASSERT(cpu.has_sse2()); 771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org probed_features |= static_cast<uint64_t>(1) << SSE2; 781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 79af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // CMOV must be available on every x64 CPU. 801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org ASSERT(cpu.has_cmov()); 811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org probed_features |= static_cast<uint64_t>(1) << CMOV; 821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // SAHF is not generally available in long mode. 841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (cpu.has_sahf()) { 851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org probed_features |= static_cast<uint64_t>(1) << SAHF; 86e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 87e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 88750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org uint64_t platform_features = OS::CpuFeaturesImpliedByPlatform(); 89750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org supported_ = probed_features | platform_features; 90750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org found_by_runtime_probing_only_ 91750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org = probed_features & ~kDefaultCpuFeatures & ~platform_features; 9271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 9371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 94defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 95defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// ----------------------------------------------------------------------------- 96defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of RelocInfo 97defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 98defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Patch the code at the current PC with a call to the target address. 99defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Additional guard int3 instructions can be added if required. 100defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 101594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int code_size = Assembler::kCallSequenceLength + guard_bytes; 1024af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1034af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Create a code patcher. 1044af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org CodePatcher patcher(pc_, code_size); 1054af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1064af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Add a label for checking the size of the code used for returning. 1074af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#ifdef DEBUG 1084af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org Label check_codesize; 1094af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->bind(&check_codesize); 1104af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#endif 1114af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1124af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Patch the code. 1133c12eb14bac172c26c619fd306c89b98034f3f24bmeurer@chromium.org patcher.masm()->movq(kScratchRegister, target, RelocInfo::NONE64); 1143c12eb14bac172c26c619fd306c89b98034f3f24bmeurer@chromium.org patcher.masm()->call(kScratchRegister); 1154af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1164af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Check that the size of the code generated is as expected. 117594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT_EQ(Assembler::kCallSequenceLength, 1184af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 119defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 120defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // Add the requested number of int3 instructions after the call. 121defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org for (int i = 0; i < guard_bytes; i++) { 1224af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org patcher.masm()->int3(); 123defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 124defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 125defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 126defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 127911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 128911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Patch the code at the current address with the supplied instructions. 129911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org for (int i = 0; i < instruction_count; i++) { 130911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org *(pc_ + i) = *(instructions + i); 131911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1324af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1334af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // Indicate that code has changed. 1344af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org CPU::FlushICache(pc_, instruction_count); 135911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 136911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 137c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 138c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// ----------------------------------------------------------------------------- 139c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Register constants. 140c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 141a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgconst int 142a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Register::kRegisterCodeByAllocationIndex[kMaxNumAllocatableRegisters] = { 143935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org // rax, rbx, rdx, rcx, rsi, rdi, r8, r9, r11, r14, r15 144935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 0, 3, 2, 1, 6, 7, 8, 9, 11, 14, 15 145c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}; 146c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgconst int Register::kAllocationIndexByRegisterCode[kNumRegisters] = { 148935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 0, 3, 2, 1, -1, -1, 4, 5, 6, 7, -1, 8, -1, -1, 9, 10 149c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}; 150c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 151c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 152defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// ----------------------------------------------------------------------------- 153defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org// Implementation of Operand 154defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1555c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Register base, int32_t disp) : rex_(0) { 156defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org len_ = 1; 157defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (base.is(rsp) || base.is(r12)) { 158defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // SIB byte is needed to encode (rsp + offset) or (r12 + offset). 159defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_sib(times_1, rsp, base); 160defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 161defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 162defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (disp == 0 && !base.is(rbp) && !base.is(r13)) { 163defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(0, base); 164defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else if (is_int8(disp)) { 165defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(1, base); 166defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp8(disp); 167defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else { 168defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(2, base); 169defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp32(disp); 170defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 171defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 172defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 173defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 174defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgOperand::Operand(Register base, 175defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org Register index, 176defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org ScaleFactor scale, 1775c838251403b0be9a882540f1922577abba4c872ager@chromium.org int32_t disp) : rex_(0) { 178defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org ASSERT(!index.is(rsp)); 179defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org len_ = 1; 180defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_sib(scale, index, base); 181defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (disp == 0 && !base.is(rbp) && !base.is(r13)) { 182defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // This call to set_modrm doesn't overwrite the REX.B (or REX.X) bits 183defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // possibly set by set_sib. 184defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(0, rsp); 185defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else if (is_int8(disp)) { 186defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(1, rsp); 187defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp8(disp); 188defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else { 189defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_modrm(2, rsp); 190defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_disp32(disp); 191defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 192defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 193defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 194defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgOperand::Operand(Register index, 1965c838251403b0be9a882540f1922577abba4c872ager@chromium.org ScaleFactor scale, 1975c838251403b0be9a882540f1922577abba4c872ager@chromium.org int32_t disp) : rex_(0) { 1985c838251403b0be9a882540f1922577abba4c872ager@chromium.org ASSERT(!index.is(rsp)); 1995c838251403b0be9a882540f1922577abba4c872ager@chromium.org len_ = 1; 2005c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_modrm(0, rsp); 2015c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_sib(scale, index, rbp); 2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org set_disp32(disp); 2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2045c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2055c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2069155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgOperand::Operand(const Operand& operand, int32_t offset) { 2079155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org ASSERT(operand.len_ >= 1); 2089155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Operand encodes REX ModR/M [SIB] [Disp]. 2099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org byte modrm = operand.buf_[0]; 2109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org ASSERT(modrm < 0xC0); // Disallow mode 3 (register target). 2119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org bool has_sib = ((modrm & 0x07) == 0x04); 2129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org byte mode = modrm & 0xC0; 2139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int disp_offset = has_sib ? 2 : 1; 2149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int base_reg = (has_sib ? operand.buf_[1] : modrm) & 0x07; 2159155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 0 with rbp/r13 as ModR/M or SIB base register always has a 32-bit 2169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // displacement. 2179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org bool is_baseless = (mode == 0) && (base_reg == 0x05); // No base or RIP base. 2189155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org int32_t disp_value = 0; 2199155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (mode == 0x80 || is_baseless) { 2209155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 2 or mode 0 with rbp/r13 as base: Word displacement. 22126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org disp_value = *BitCast<const int32_t*>(&operand.buf_[disp_offset]); 2229155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else if (mode == 0x40) { 2239155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Mode 1: Byte displacement. 2249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org disp_value = static_cast<signed char>(operand.buf_[disp_offset]); 2259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 2269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 2279155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Write new operand with same registers, but with modified displacement. 2289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org ASSERT(offset >= 0 ? disp_value + offset > disp_value 2299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org : disp_value + offset < disp_value); // No overflow. 2309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org disp_value += offset; 2319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org rex_ = operand.rex_; 2329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (!is_int8(disp_value) || is_baseless) { 2339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need 32 bits of displacement, mode 2 or mode 1 with register rbp/r13. 2349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f) | (is_baseless ? 0x00 : 0x80); 2359155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset + 4; 2369155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org Memory::int32_at(&buf_[disp_offset]) = disp_value; 2379155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else if (disp_value != 0 || (base_reg == 0x05)) { 2389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need 8 bits of displacement. 2399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f) | 0x40; // Mode 1. 2409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset + 1; 2419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[disp_offset] = static_cast<byte>(disp_value); 2429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } else { 2439155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // Need no displacement. 2449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[0] = (modrm & 0x3f); // Mode 0. 2459155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org len_ = disp_offset; 2469155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 2479155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org if (has_sib) { 2489155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org buf_[1] = operand.buf_[1]; 2499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org } 2509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} 2519155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org 2520ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 2530ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgbool Operand::AddressUsesRegister(Register reg) const { 2540ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int code = reg.code(); 2550ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org ASSERT((buf_[0] & 0xC0) != 0xC0); // Always a memory operand. 2560ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Start with only low three bits of base register. Initial decoding doesn't 2570ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // distinguish on the REX.B bit. 2580ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int base_code = buf_[0] & 0x07; 2590ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rsp.code()) { 2600ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // SIB byte present in buf_[1]. 2610ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Check the index register from the SIB byte + REX.X prefix. 2620ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org int index_code = ((buf_[1] >> 3) & 0x07) | ((rex_ & 0x02) << 2); 2630ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Index code (including REX.X) of 0x04 (rsp) means no index register. 2640ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (index_code != rsp.code() && index_code == code) return true; 2650ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Add REX.B to get the full base register code. 2660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org base_code = (buf_[1] & 0x07) | ((rex_ & 0x01) << 3); 2670ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // A base register of 0x05 (rbp) with mod = 0 means no base register. 2680ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; 2690ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return code == base_code; 2700ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 2710ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // A base register with low bits of 0x05 (rbp or r13) and mod = 0 means 2720ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // no base register. 2730ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (base_code == rbp.code() && ((buf_[0] & 0xC0) == 0)) return false; 2740ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org base_code |= ((rex_ & 0x01) << 3); 2750ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return code == base_code; 2760ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 2770ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 2780ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 2790ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 28071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// ----------------------------------------------------------------------------- 2815c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Implementation of Assembler. 28271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 28371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef GENERATED_CODE_COVERAGE 28471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void InitCoverageLog(); 28571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 28671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 2878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 2888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : AssemblerBase(isolate, buffer, buffer_size), 289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_targets_(100), 290e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org positions_recorder_(this) { 29171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Clear the buffer in debug mode unless it was provided by the 29271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // caller in which case we can't be sure it's okay to overwrite 293a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // existing code in it. 29471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef DEBUG 29571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (own_buffer_) { 2968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org memset(buffer_, 0xCC, buffer_size_); // int3 29771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 29871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 29971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 3008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 30171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 302f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 30371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef GENERATED_CODE_COVERAGE 30471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org InitCoverageLog(); 30571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 30671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 30771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 30871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 30971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::GetCode(CodeDesc* desc) { 3105c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Finalize code (at this point overflow() may be true, but the gap ensures 3115c838251403b0be9a882540f1922577abba4c872ager@chromium.org // that we are still not overlapping instructions and relocation info). 3125c838251403b0be9a882540f1922577abba4c872ager@chromium.org ASSERT(pc_ <= reloc_info_writer.pos()); // No overlap. 313f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up code descriptor. 31471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->buffer = buffer_; 31571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->buffer_size = buffer_size_; 31671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->instr_size = pc_offset(); 31786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org ASSERT(desc->instr_size > 0); // Zero-size code objects upset the system. 318c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org desc->reloc_size = 319c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); 32071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc->origin = this; 32171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 32271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 32371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 32471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::Align(int m) { 32571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org ASSERT(IsPowerOf2(m)); 32640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org int delta = (m - (pc_offset() & (m - 1))) & (m - 1); 32764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Nop(delta); 328b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 329b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 330b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3315ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgvoid Assembler::CodeTargetAlign() { 3325ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org Align(16); // Preferred alignment of jump targets on x64. 3335ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 3345ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 3355ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 33664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool Assembler::IsNop(Address addr) { 33764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Address a = addr; 33864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (*a == 0x66) a++; 33964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (*a == 0x90) return true; 34064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org if (a[0] == 0xf && a[1] == 0x1f) return true; 34164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return false; 34264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 34364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 34464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 345755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::bind_to(Label* L, int pos) { 346755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(!L->is_bound()); // Label may only be bound once. 347755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(0 <= pos && pos <= pc_offset()); // Position must be valid. 348755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_linked()) { 349755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int current = L->pos(); 350755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int next = long_at(current); 351755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org while (next != current) { 3525c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relative address, relative to point after address. 353755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int imm32 = pos - (current + sizeof(int32_t)); 354755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org long_at_put(current, imm32); 355755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org current = next; 356755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org next = long_at(next); 357755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 358755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Fix up last fixup on linked list. 359755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int last_imm32 = pos - (current + sizeof(int32_t)); 360755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org long_at_put(current, last_imm32); 361755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 36283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org while (L->is_near_linked()) { 36383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int fixup_pos = L->near_link_pos(); 36483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset_to_next = 36583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 36683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org ASSERT(offset_to_next <= 0); 36783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int disp = pos - (fixup_pos + sizeof(int8_t)); 3689c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.org CHECK(is_int8(disp)); 36983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org set_byte_at(fixup_pos, disp); 37083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (offset_to_next < 0) { 37183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(fixup_pos + offset_to_next, Label::kNear); 37283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else { 37383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->UnuseNear(); 37483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 37583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 376755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->bind_to(pos); 377b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 378b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 379b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 380755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::bind(Label* L) { 381755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org bind_to(L, pc_offset()); 382b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 383b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 384755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 38571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::GrowBuffer() { 3865c838251403b0be9a882540f1922577abba4c872ager@chromium.org ASSERT(buffer_overflow()); 38771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (!own_buffer_) FATAL("external code buffer is too small"); 38871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 3895c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Compute new buffer size. 39071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CodeDesc desc; // the new buffer 39171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (buffer_size_ < 4*KB) { 39271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.buffer_size = 4*KB; 39371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else { 39471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.buffer_size = 2*buffer_size_; 39571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 39671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Some internal data structures overflow for very large buffers, 39771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // they must ensure that kMaximalBufferSize is not too large. 39871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if ((desc.buffer_size > kMaximalBufferSize) || 399c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) { 40071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 40171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 402b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 403f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up new buffer. 40471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.buffer = NewArray<byte>(desc.buffer_size); 40571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org desc.instr_size = pc_offset(); 406c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org desc.reloc_size = 407c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>((buffer_ + buffer_size_) - (reloc_info_writer.pos())); 408b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 40971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Clear the buffer in debug mode. Use 'int3' instructions to make 41071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // sure to get into problems if we ever run uninitialized code. 41171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#ifdef DEBUG 41271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org memset(desc.buffer, 0xCC, desc.buffer_size); 41371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#endif 414b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4155c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Copy the data. 4163e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t pc_delta = desc.buffer - buffer_; 4173e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t rc_delta = (desc.buffer + desc.buffer_size) - 4183e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org (buffer_ + buffer_size_); 419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemMove(desc.buffer, buffer_, desc.instr_size); 420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemMove(rc_delta + reloc_info_writer.pos(), 421e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org reloc_info_writer.pos(), desc.reloc_size); 422b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4235c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Switch buffers. 424c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (isolate() != NULL && 425c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org isolate()->assembler_spare_buffer() == NULL && 426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org buffer_size_ == kMinimalBufferSize) { 427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->set_assembler_spare_buffer(buffer_); 42871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else { 42971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DeleteArray(buffer_); 43071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 43171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org buffer_ = desc.buffer; 43271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org buffer_size_ = desc.buffer_size; 43371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org pc_ += pc_delta; 43471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 43571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org reloc_info_writer.last_pc() + pc_delta); 436b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4375c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Relocate runtime entries. 43871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org for (RelocIterator it(desc); !it.done(); it.next()) { 43971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org RelocInfo::Mode rmode = it.rinfo()->rmode(); 4403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org if (rmode == RelocInfo::INTERNAL_REFERENCE) { 4413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org intptr_t* p = reinterpret_cast<intptr_t*>(it.rinfo()->pc()); 44271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (*p != 0) { // 0 means uninitialized. 44371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org *p += pc_delta; 44471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 44571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 44671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 447b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4484af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org ASSERT(!buffer_overflow()); 449b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 450b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 451b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::emit_operand(int code, const Operand& adr) { 4535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(is_uint3(code)); 45471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const unsigned length = adr.len_; 45571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org ASSERT(length > 0); 456b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 457e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Emit updated ModR/M byte containing the given register. 4585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT((adr.buf_[0] & 0x38) == 0); 4595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org pc_[0] = adr.buf_[0] | code << 3; 460b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 46171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Emit the rest of the encoded operand. 46271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 46371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org pc_ += length; 464b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 465b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 466b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4675c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Assembler Instruction implementations. 468755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 469755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::arithmetic_op(byte opcode, Register reg, const Operand& op) { 47071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 471755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(reg, op); 472755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(opcode); 473755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(reg, op); 474b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 475b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 476b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 477911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op(byte opcode, Register reg, Register rm_reg) { 47871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 4799dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com ASSERT((opcode & 0xC6) == 2); 4809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (rm_reg.low_bits() == 4) { // Forces SIB byte. 4819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 4829dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_64(rm_reg, reg); 4839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode ^ 0x02); 4849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 4859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 4869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_64(reg, rm_reg); 4879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 4889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 4899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 490755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 491755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 4925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 493911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op_16(byte opcode, Register reg, Register rm_reg) { 4945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 4959dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com ASSERT((opcode & 0xC6) == 2); 4969dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (rm_reg.low_bits() == 4) { // Forces SIB byte. 4979dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 4989dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x66); 4999dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(rm_reg, reg); 5009dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode ^ 0x02); 5019dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 5029dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 5039dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x66); 5049dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(reg, rm_reg); 5059dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 5069dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 5079dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 508911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 509911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 510911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 511911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op_16(byte opcode, 512911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Register reg, 513911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const Operand& rm_reg) { 514911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 515911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); 516911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(reg, rm_reg); 517911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(opcode); 518911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(reg, rm_reg); 519911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 520911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 521911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 522911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::arithmetic_op_32(byte opcode, Register reg, Register rm_reg) { 523911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 5249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com ASSERT((opcode & 0xC6) == 2); 5259dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (rm_reg.low_bits() == 4) { // Forces SIB byte. 5269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Swap reg and rm_reg and change opcode operand order. 5279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(rm_reg, reg); 5289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode ^ 0x02); // E.g. 0x03 -> 0x01 for ADD. 5299dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(rm_reg, reg); 5309dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 5319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(reg, rm_reg); 5329dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(opcode); 5339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(reg, rm_reg); 5349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 5355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 5365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 5375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 53868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgvoid Assembler::arithmetic_op_32(byte opcode, 539e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org Register reg, 540e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org const Operand& rm_reg) { 54168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org EnsureSpace ensure_space(this); 542e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit_optional_rex_32(reg, rm_reg); 54368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org emit(opcode); 544e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit_operand(reg, rm_reg); 54568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org} 54668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 54768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 548755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op(byte subcode, 549755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org Register dst, 550755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org Immediate src) { 551755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 552755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 553755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (is_int8(src.value_)) { 554755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x83); 555e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 556755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(src.value_); 557755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (dst.is(rax)) { 558755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x05 | (subcode << 3)); 559755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 560755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 561755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x81); 562e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 563755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 564755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 565755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 566755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 567755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op(byte subcode, 568755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const Operand& dst, 569755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org Immediate src) { 570755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 571755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 572755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (is_int8(src.value_)) { 573755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x83); 574eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 575755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(src.value_); 576755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 577755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x81); 578eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 579755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(src.value_); 580755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 581755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 582755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 583755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 584911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op_16(byte subcode, 585911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Register dst, 586911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Immediate src) { 587911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 588911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); // Operand size override prefix. 589911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 590911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_int8(src.value_)) { 591911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x83); 592911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_modrm(subcode, dst); 593911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(src.value_); 594911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else if (dst.is(rax)) { 595911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x05 | (subcode << 3)); 5963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 597911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 598911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x81); 599911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_modrm(subcode, dst); 6003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 601911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 602911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 603911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 604911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 605911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::immediate_arithmetic_op_16(byte subcode, 606911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const Operand& dst, 607911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Immediate src) { 608911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 609911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x66); // Operand size override prefix. 610911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 611911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_int8(src.value_)) { 612911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x83); 613911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(subcode, dst); 614911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(src.value_); 615911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 616911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x81); 617911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(subcode, dst); 6183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emitw(src.value_); 619911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 620911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 621911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 622911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 623eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::immediate_arithmetic_op_32(byte subcode, 6245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org Register dst, 6255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org Immediate src) { 6265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 6275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_optional_rex_32(dst); 6285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org if (is_int8(src.value_)) { 62986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit(0x83); 6305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(subcode, dst); 6315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(src.value_); 6325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } else if (dst.is(rax)) { 6335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x05 | (subcode << 3)); 6345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emitl(src.value_); 6355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } else { 6365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x81); 6375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(subcode, dst); 6385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emitl(src.value_); 6395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 6405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 6415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 6425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 6435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::immediate_arithmetic_op_32(byte subcode, 644eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org const Operand& dst, 645eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org Immediate src) { 646eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 647eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_optional_rex_32(dst); 648eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (is_int8(src.value_)) { 649eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x83); 650eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 651eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(src.value_); 652eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } else { 653eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x81); 654eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 655eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emitl(src.value_); 656eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 657eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 658eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 659eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 660eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::immediate_arithmetic_op_8(byte subcode, 6613e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org const Operand& dst, 6623e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Immediate src) { 663eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 664eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_optional_rex_32(dst); 6653e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(is_int8(src.value_) || is_uint8(src.value_)); 666eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x80); 667eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(subcode, dst); 668eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(src.value_); 669eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 670eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 671eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 6723e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::immediate_arithmetic_op_8(byte subcode, 6733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Register dst, 6743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Immediate src) { 6753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 67656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 6773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // Use 64-bit mode byte registers. 6783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst); 6793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org } 6803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(is_int8(src.value_) || is_uint8(src.value_)); 6813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x80); 6823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(subcode, dst); 6833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(src.value_); 6843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 6853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 6863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 687e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shift(Register dst, Immediate shift_amount, int subcode) { 688e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 689e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org ASSERT(is_uint6(shift_amount.value_)); // illegal shift count 690e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (shift_amount.value_ == 1) { 691e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst); 692e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xD1); 693e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 694e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 695e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst); 696e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC1); 697e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 698e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(shift_amount.value_); 699e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 700e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 701e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 702e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 703e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shift(Register dst, int subcode) { 704e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 705e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst); 706e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xD3); 707e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(subcode, dst); 708e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 709e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 710e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 7115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::shift_32(Register dst, int subcode) { 7125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 7135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_optional_rex_32(dst); 7145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD3); 7155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(subcode, dst); 7165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 7175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 7185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 719defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgvoid Assembler::shift_32(Register dst, Immediate shift_amount, int subcode) { 720defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org EnsureSpace ensure_space(this); 7219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com ASSERT(is_uint5(shift_amount.value_)); // illegal shift count 722defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (shift_amount.value_ == 1) { 723defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit_optional_rex_32(dst); 724defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit(0xD1); 725defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit_modrm(subcode, dst); 726defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } else { 727defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit_optional_rex_32(dst); 728defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit(0xC1); 729defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit_modrm(subcode, dst); 730defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org emit(shift_amount.value_); 731defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 732defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org} 733defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 734defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 735e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::bt(const Operand& dst, Register src) { 736e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 737e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 738e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 739e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA3); 740e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 741e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 742e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 743e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 744e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::bts(const Operand& dst, Register src) { 745e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 746e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 747e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 748e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAB); 749e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 750e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 751e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 752e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 753755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::call(Label* L) { 754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 755755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 7565c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 757755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE8); 758755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 759755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offset = L->pos() - pc_offset() - sizeof(int32_t); 760755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(offset <= 0); 761755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(offset); 762755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (L->is_linked()) { 763755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 764755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(pc_offset() - sizeof(int32_t)); 765755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 766755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(L->is_unused()); 767755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 768755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 769755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 770755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 771b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 772b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 773b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 7746e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::call(Address entry, RelocInfo::Mode rmode) { 7756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(RelocInfo::IsRuntimeEntry(rmode)); 7766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org positions_recorder()->WriteRecordedPositions(); 7776e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 7786e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org // 1110 1000 #32-bit disp. 7796e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0xE8); 7806e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 7816e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 7826e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 7836e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 7848e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid Assembler::call(Handle<Code> target, 7858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org RelocInfo::Mode rmode, 786471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId ast_id) { 787f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 788c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 7895c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1000 #32-bit disp. 790c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0xE8); 7918e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org emit_code_target(target, rmode, ast_id); 792c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 793c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 794c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 795e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::call(Register adr) { 796a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 797e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 7985c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: FF /2 r64. 79940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(adr); 800e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 801e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x2, adr); 802e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 803e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 804e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 805e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::call(const Operand& op) { 806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org positions_recorder()->WriteRecordedPositions(); 807e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 8085c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: FF /2 m64. 80940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(op); 810e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 81140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_operand(0x2, op); 812e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 813e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 814e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 81583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Calls directly to the given address using a relative offset. 81683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Should only ever be used in Code objects for calls within the 81783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// same Code object. Should not be used when generating new code (use labels), 81883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// but only when patching existing code. 81983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid Assembler::call(Address target) { 82083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org positions_recorder()->WriteRecordedPositions(); 82183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org EnsureSpace ensure_space(this); 82283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org // 1110 1000 #32-bit disp. 82383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0xE8); 82483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org Address source = pc_ + 4; 82583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org intptr_t displacement = target - source; 82683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org ASSERT(is_int32(displacement)); 82783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emitl(static_cast<int32_t>(displacement)); 82883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 82983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 83083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 8319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::clc() { 8329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 8339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xF8); 8349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 8359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 836e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 8377979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::cld() { 8387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org EnsureSpace ensure_space(this); 8397979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org emit(0xFC); 8407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org} 8417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org 842e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 8430b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid Assembler::cdq() { 8440b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org EnsureSpace ensure_space(this); 8450b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org emit(0x99); 8460b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org} 8470b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 8480b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 8493e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovq(Condition cc, Register dst, Register src) { 8509d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 8519d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movq(dst, src); 8529d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 8539d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 8549d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 8553e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // No need to check CpuInfo for CMOV support, it's a required part of the 8563e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // 64-bit architecture. 8573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(cc >= 0); // Use mov for unconditional moves. 8583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 8595c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: REX.W 0f 40 + cc /r. 8603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 8613e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 8623e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 8633e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(dst, src); 8643e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 8653e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8663e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8673e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovq(Condition cc, Register dst, const Operand& src) { 8689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 8699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movq(dst, src); 8709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 8719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 8729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 8733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(cc >= 0); 8743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 8755c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: REX.W 0f 40 + cc /r. 8763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 8773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 8783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 8793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 8803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 8813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovl(Condition cc, Register dst, Register src) { 8849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 8859d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movl(dst, src); 8869d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 8879d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 8889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 8893e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(cc >= 0); 8903e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 8915c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: 0f 40 + cc /r. 8923e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 8933e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 8943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 8953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_modrm(dst, src); 8963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 8973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 8993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cmovl(Condition cc, Register dst, const Operand& src) { 9009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 9019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movl(dst, src); 9029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 9039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 9049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 9053e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org ASSERT(cc >= 0); 9063e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 9075c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode: 0f 40 + cc /r. 9083e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 9093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0f); 9103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x40 + cc); 9113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 9123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 9133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 9143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 915911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::cmpb_al(Immediate imm8) { 916911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); 917911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 918911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0x3c); 919911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(imm8.value_); 920911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 921911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 9223e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 923eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::cpuid() { 924eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 925eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x0F); 926eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xA2); 927eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 928eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 929eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 930e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::cqo() { 931e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 932e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(); 933e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x99); 934e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 935e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 936e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 937eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::decq(Register dst) { 93871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 939755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 940755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 941e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x1, dst); 942b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 943b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 944b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 945eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::decq(const Operand& dst) { 94671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 947755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 948755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 949755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(1, dst); 950b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 951b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 952b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 953e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgvoid Assembler::decl(Register dst) { 954e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org EnsureSpace ensure_space(this); 955e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit_optional_rex_32(dst); 956e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit(0xFF); 957e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org emit_modrm(0x1, dst); 958e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org} 959e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 960e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 961eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::decl(const Operand& dst) { 962eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 963eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_optional_rex_32(dst); 964eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xFF); 965eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(1, dst); 966eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 967eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 968eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 9699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::decb(Register dst) { 9709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 97156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 9729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Register is not one of al, bl, cl, dl. Its encoding needs REX. 9739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_rex_32(dst); 9749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 9759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xFE); 9769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_modrm(0x1, dst); 9779d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 9789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 9799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 9809d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::decb(const Operand& dst) { 9819d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 9829d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_optional_rex_32(dst); 9839d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit(0xFE); 9849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com emit_operand(1, dst); 9859d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 9869d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 9879d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 988e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::enter(Immediate size) { 989e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 990e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC8); 991e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emitw(size.value_); // 16 bit operand, always. 992e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0); 993e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 994e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 995e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 99671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::hlt() { 99771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 998755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF4); 999b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1000b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1001b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 10020b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid Assembler::idivq(Register src) { 1003e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1004e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src); 1005e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xF7); 1006e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x7, src); 1007e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1008e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1009e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 10100b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid Assembler::idivl(Register src) { 10110b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org EnsureSpace ensure_space(this); 10120b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org emit_optional_rex_32(src); 10130b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org emit(0xF7); 10140b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org emit_modrm(0x7, src); 10150b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org} 10160b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 10170b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 10182abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.orgvoid Assembler::imul(Register src) { 10192abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org EnsureSpace ensure_space(this); 10202abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org emit_rex_64(src); 10212abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org emit(0xF7); 10222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org emit_modrm(0x5, src); 10232abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 10242abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 10252abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 10265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::imul(Register dst, Register src) { 10275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 10285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_rex_64(dst, src); 10295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x0F); 10305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xAF); 10315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(dst, src); 10325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 10335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 10345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1035e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::imul(Register dst, const Operand& src) { 1036e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1037e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst, src); 1038e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 1039e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAF); 1040e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1041e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1042e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1043e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1044e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::imul(Register dst, Register src, Immediate imm) { 1045e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1046e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst, src); 1047e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (is_int8(imm.value_)) { 1048e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x6B); 1049e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(dst, src); 1050e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(imm.value_); 1051e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 1052e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x69); 1053e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(dst, src); 1054e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emitl(imm.value_); 1055e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1056e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1057e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1058e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 10595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::imull(Register dst, Register src) { 10605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 10615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_optional_rex_32(dst, src); 10625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x0F); 10635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xAF); 10645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(dst, src); 10655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 10665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 10675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1068d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.comvoid Assembler::imull(Register dst, const Operand& src) { 1069d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com EnsureSpace ensure_space(this); 1070d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com emit_optional_rex_32(dst, src); 1071d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com emit(0x0F); 1072d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com emit(0xAF); 1073d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com emit_operand(dst, src); 1074d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com} 1075d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 1076d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 1077cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgvoid Assembler::imull(Register dst, Register src, Immediate imm) { 1078cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org EnsureSpace ensure_space(this); 1079cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_optional_rex_32(dst, src); 1080cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org if (is_int8(imm.value_)) { 1081cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x6B); 1082cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_modrm(dst, src); 1083cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(imm.value_); 1084cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } else { 1085cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x69); 1086cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_modrm(dst, src); 1087cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emitl(imm.value_); 1088cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 1089cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} 1090cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1091cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1092eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::incq(Register dst) { 109371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1094755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1095755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 1096e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, dst); 1097b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1098b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1099b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1100eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::incq(const Operand& dst) { 110171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1102755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1103755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 1104755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(0, dst); 1105b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1106b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1107b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1108eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::incl(const Operand& dst) { 1109eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 1110eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_optional_rex_32(dst); 1111eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xFF); 1112eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_operand(0, dst); 1113eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1114eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1115eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 11165ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgvoid Assembler::incl(Register dst) { 11175ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org EnsureSpace ensure_space(this); 11185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org emit_optional_rex_32(dst); 11195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org emit(0xFF); 11205ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org emit_modrm(0, dst); 11215ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 11225ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 11235ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 112471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::int3() { 112571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1126755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xCC); 1127b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1128b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1129b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 11307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 11319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc == always) { 11329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com jmp(L); 11339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 11349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (cc == never) { 11359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 11369d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 1137755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 11385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(is_uint4(cc)); 1139755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 1140755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const int short_size = 2; 1141755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const int long_size = 6; 1142755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offs = L->pos() - pc_offset(); 1143755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(offs <= 0); 1144000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // Determine whether we can use 1-byte offsets for backwards branches, 1145000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // which have a max range of 128 bytes. 1146000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 1147e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // We also need to check predictable_code_size() flag here, because on x64, 1148e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // when the full code generator recompiles code for debugging, some places 1149e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // need to be padded out to a certain size. The debugger is keeping track of 1150e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // how often it did this so that it can adjust return addresses on the 1151e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // stack, but if the size of jump instructions can also change, that's not 1152e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // enough and the calculated offsets would be incorrect. 1153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (is_int8(offs - short_size) && !predictable_code_size()) { 11545c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0111 tttn #8-bit disp. 1155755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x70 | cc); 1156755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit((offs - short_size) & 0xFF); 1157755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 11585c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1159755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 1160755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 1161755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(offs - long_size); 1162755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 116383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 116483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // 0111 tttn #8-bit disp 116583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(0x70 | cc); 116683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org byte disp = 0x00; 116783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (L->is_near_linked()) { 116883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset = L->near_link_pos() - pc_offset(); 116983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org ASSERT(is_int8(offset)); 117083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org disp = static_cast<byte>(offset & 0xFF); 117183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 117283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(pc_offset(), Label::kNear); 117383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(disp); 1174755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else if (L->is_linked()) { 11755c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1176755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 1177755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 1178755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 1179755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(pc_offset() - sizeof(int32_t)); 1180755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 1181755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(L->is_unused()); 1182755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x0F); 1183755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x80 | cc); 1184755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 1185755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 1186755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 1187755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1188755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1189755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1190755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 11916e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::j(Condition cc, Address entry, RelocInfo::Mode rmode) { 11926e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(RelocInfo::IsRuntimeEntry(rmode)); 11936e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 11946e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(is_uint4(cc)); 11956e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0x0F); 11966e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0x80 | cc); 11976e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 11986e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 11996e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 12006e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1201c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid Assembler::j(Condition cc, 1202c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Handle<Code> target, 1203c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org RelocInfo::Mode rmode) { 1204c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 1205c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org ASSERT(is_uint4(cc)); 12065c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1207c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0x0F); 1208c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0x80 | cc); 1209c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit_code_target(target, rmode); 1210c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 1211c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1212c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 121383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid Assembler::jmp(Label* L, Label::Distance distance) { 1214755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1215c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org const int short_size = sizeof(int8_t); 1216c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org const int long_size = sizeof(int32_t); 1217755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (L->is_bound()) { 1218755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int offs = L->pos() - pc_offset() - 1; 1219755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(offs <= 0); 1220e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (is_int8(offs - short_size) && !predictable_code_size()) { 12215c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1011 #8-bit disp. 1222755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xEB); 1223c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org emit((offs - short_size) & 0xFF); 1224755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 12255c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1226755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1227c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org emitl(offs - long_size); 1228755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 122983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (distance == Label::kNear) { 123083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(0xEB); 123183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org byte disp = 0x00; 123283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org if (L->is_near_linked()) { 123383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org int offset = L->near_link_pos() - pc_offset(); 123483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org ASSERT(is_int8(offset)); 123583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org disp = static_cast<byte>(offset & 0xFF); 123683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 123783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org L->link_to(pc_offset(), Label::kNear); 123883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org emit(disp); 123983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } else if (L->is_linked()) { 12405c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1241755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1242755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(L->pos()); 1243c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org L->link_to(pc_offset() - long_size); 1244755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 12455c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1246755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org ASSERT(L->is_unused()); 1247755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xE9); 1248755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org int32_t current = pc_offset(); 1249755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emitl(current); 1250755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org L->link_to(current); 1251755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1252755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1253755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1254755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1255c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid Assembler::jmp(Handle<Code> target, RelocInfo::Mode rmode) { 1256c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org EnsureSpace ensure_space(this); 12575c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 1110 1001 #32-bit disp. 1258c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit(0xE9); 1259c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org emit_code_target(target, rmode); 1260c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 1261c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1262c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 12636e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid Assembler::jmp(Address entry, RelocInfo::Mode rmode) { 12646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(RelocInfo::IsRuntimeEntry(rmode)); 12656e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org EnsureSpace ensure_space(this); 12666e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org ASSERT(RelocInfo::IsRuntimeEntry(rmode)); 12676e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit(0xE9); 12686e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org emit_runtime_entry(entry, rmode); 12696e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org} 12706e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 12716e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1272e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::jmp(Register target) { 1273e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 12745c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode FF/4 r64. 127540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(target); 1276e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xFF); 1277e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x4, target); 1278e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1279e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1280e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1281911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::jmp(const Operand& src) { 1282911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 12835c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Opcode FF/4 m64. 1284911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(src); 1285911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0xFF); 1286911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(0x4, src); 1287911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1288911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1289911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1290e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::lea(Register dst, const Operand& src) { 1291e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1292e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(dst, src); 1293e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x8D); 1294e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1295e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1296e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1297e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1298cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgvoid Assembler::leal(Register dst, const Operand& src) { 1299cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org EnsureSpace ensure_space(this); 1300cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_optional_rex_32(dst, src); 1301cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0x8D); 1302cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_operand(dst, src); 1303cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} 1304cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1305cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1306e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::load_rax(void* value, RelocInfo::Mode mode) { 1307e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1308e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x48); // REX.W 1309e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA1); 1310fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org emitp(value, mode); 1311e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1312e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1313e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1314e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::load_rax(ExternalReference ref) { 1315e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org load_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE); 1316e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1317e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1318e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1319e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::leave() { 1320e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1321e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xC9); 1322e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1323e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1324e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1325e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(Register dst, const Operand& src) { 1326e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 132756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 1328a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1329a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(dst, src); 1330a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } else { 1331a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_optional_rex_32(dst, src); 1332a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1333e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x8A); 1334e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1335e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1336e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1337cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1338e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(Register dst, Immediate imm) { 1339e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 134056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register()) { 1341a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(dst); 1342a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1343a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit(0xB0 + dst.low_bits()); 1344e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(imm.value_); 1345e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1346e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1347cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1348e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movb(const Operand& dst, Register src) { 1349e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 135056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!src.is_byte_register()) { 1351a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_rex_32(src, dst); 1352a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } else { 1353a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org emit_optional_rex_32(src, dst); 1354a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 1355e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x88); 1356e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 1357e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1358e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1359cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1360e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movb(const Operand& dst, Immediate imm) { 1361e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1362e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst); 1363e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xC6); 1364e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(0x0, dst); 1365e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_)); 1366e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1367e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1368e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1369e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movw(Register dst, const Operand& src) { 1370e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1371e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x66); 1372e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst, src); 1373e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x8B); 1374e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(dst, src); 1375e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1376e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1377e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 13783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movw(const Operand& dst, Register src) { 13793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 13803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x66); 13813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_optional_rex_32(src, dst); 13823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x89); 13833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(src, dst); 13843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 13853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 1386cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1387e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movw(const Operand& dst, Immediate imm) { 1388e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1389e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0x66); 1390e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_optional_rex_32(dst); 1391e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xC7); 1392e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_operand(0x0, dst); 1393e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_ & 0xff)); 1394e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(static_cast<byte>(imm.value_ >> 8)); 1395e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1396e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1397e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1398ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, const Operand& src, int size) { 1399e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1400ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, src, size); 1401e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x8B); 1402e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(dst, src); 1403e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1404e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1405e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1406ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, Register src, int size) { 1407e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 14089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 1409ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(src, dst, size); 14109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x89); 14119dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 14129dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 1413ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, src, size); 14149dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x8B); 14159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 14169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 1417e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1418e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1419e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1420ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(const Operand& dst, Register src, int size) { 1421e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1422ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(src, dst, size); 1423e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x89); 1424e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(src, dst); 1425e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1426e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1427e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1428ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(Register dst, Immediate value, int size) { 1429e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1430ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, size); 1431ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (size == kInt64Size) { 1432ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(0xC7); 1433ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_modrm(0x0, dst); 14349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 1435ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org ASSERT(size == kInt32Size); 1436ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(0xB8 + dst.low_bits()); 14379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 1438ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(value); 1439755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1440755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1441755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1442ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::emit_mov(const Operand& dst, Immediate value, int size) { 1443755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1444ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_rex(dst, size); 1445755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC7); 1446ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit_operand(0x0, dst); 1447ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org emit(value); 1448e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1449e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1450e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1451e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::movq(Register dst, void* value, RelocInfo::Mode rmode) { 14520b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // This method must not be used with heap object references. The stored 14530b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // address is not GC safe. Use the handle version instead. 14540b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org ASSERT(rmode > RelocInfo::LAST_GCED_ENUM); 1455e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (RelocInfo::IsNone(rmode)) { 1456e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org movq(dst, reinterpret_cast<int64_t>(value)); 1457c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else { 1458c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org EnsureSpace ensure_space(this); 1459c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_rex_64(dst); 1460c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0xB8 | dst.low_bits()); 1461e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emitp(value, rmode); 146268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 1463755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1464755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1465755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1466e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::movq(Register dst, int64_t value) { 1467e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1468e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_rex_64(dst); 1469e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xB8 | dst.low_bits()); 1470e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emitq(value); 1471e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1472e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1473e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1474ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.orgvoid Assembler::movq(Register dst, uint64_t value) { 1475ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org movq(dst, static_cast<int64_t>(value)); 1476eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1477eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1478eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 14795c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Loads the ip-relative location of the src label into the target location 14805c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (as a 32-bit offset sign extended to 64-bit). 1481911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Assembler::movl(const Operand& dst, Label* src) { 1482911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org EnsureSpace ensure_space(this); 1483911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_optional_rex_32(dst); 1484911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit(0xC7); 1485911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emit_operand(0, dst); 1486911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (src->is_bound()) { 1487911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int offset = src->pos() - pc_offset() - sizeof(int32_t); 1488911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(offset <= 0); 1489911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(offset); 1490911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else if (src->is_linked()) { 1491911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(src->pos()); 1492911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org src->link_to(pc_offset() - sizeof(int32_t)); 1493911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 1494911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(src->is_unused()); 1495911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int32_t current = pc_offset(); 1496911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org emitl(current); 1497911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org src->link_to(current); 1498911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1499911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 1500911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1501911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1502eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::movq(Register dst, Handle<Object> value, RelocInfo::Mode mode) { 150379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org AllowDeferredHandleDereference using_raw_address; 1504e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ASSERT(!RelocInfo::IsNone(mode)); 1505e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org EnsureSpace ensure_space(this); 1506e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ASSERT(value->IsHeapObject()); 1507e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ASSERT(!isolate()->heap()->InNewSpace(*value)); 1508e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit_rex_64(dst); 1509e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emit(0xB8 | dst.low_bits()); 1510e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org emitp(value.location(), mode); 1511eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1512eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1513eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 15143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsxbq(Register dst, const Operand& src) { 15153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 151632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org emit_rex_64(dst, src); 15173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x0F); 15183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xBE); 15193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(dst, src); 15203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 15213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsxwq(Register dst, const Operand& src) { 15243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 15253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_rex_64(dst, src); 15263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x0F); 15273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xBF); 15283811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(dst, src); 15293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 15303811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::movsxlq(Register dst, Register src) { 15335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 15345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_rex_64(dst, src); 15355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x63); 15365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_modrm(dst, src); 15375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 15385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 15395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 15403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsxlq(Register dst, const Operand& src) { 15413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 15423e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 15433e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x63); 15443e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 15453e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 15463e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 15473e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 15485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::movzxbq(Register dst, const Operand& src) { 15495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 1550f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // 32 bit operations zero the top 32 bits of 64 bit registers. Therefore 1551f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // there is no need to make this a 64 bit operation. 155232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org emit_optional_rex_32(dst, src); 15535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x0F); 15545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xB6); 15555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(dst, src); 15565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 15575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 15585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 15595a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.comvoid Assembler::movzxbl(Register dst, const Operand& src) { 15605a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 15615a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_optional_rex_32(dst, src); 15625a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0x0F); 15635a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0xB6); 15645a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_operand(dst, src); 15655a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com} 15665a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 15675a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 15683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movzxwq(Register dst, const Operand& src) { 15693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 157032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org emit_optional_rex_32(dst, src); 15713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0x0F); 15723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xB7); 15733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(dst, src); 15743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 15753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15775a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.comvoid Assembler::movzxwl(Register dst, const Operand& src) { 15785a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 15795a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_optional_rex_32(dst, src); 15805a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0x0F); 15815a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit(0xB7); 15825a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com emit_operand(dst, src); 15835a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com} 15845a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 15855a6af92a1549c81fb61855518f43b712e4c0e469christian.plesner.hansen@gmail.com 158646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgvoid Assembler::movzxwl(Register dst, Register src) { 158746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org EnsureSpace ensure_space(this); 158846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit_optional_rex_32(dst, src); 158946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit(0x0F); 159046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit(0xB7); 159146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org emit_modrm(dst, src); 159246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 159346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 159446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 1595b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsb() { 1596b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1597b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1598b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA4); 1599b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1600b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1601b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1602b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsw() { 1603b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1604b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0x66); // Operand size override. 1605b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1606b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA4); 1607b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1608b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1609b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1610b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsl() { 1611b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1612b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1613b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA5); 1614b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1615b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1616b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1617b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::repmovsq() { 1618b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 1619b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xF3); 1620b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_rex_64(); 1621b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xA5); 1622b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1623b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1624b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1625e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::mul(Register src) { 1626e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1627e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src); 1628e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xF7); 1629e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x4, src); 1630e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1631e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1632e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1633755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::neg(Register dst) { 1634755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1635755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1636755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1637e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x3, dst); 1638755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1639755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1640755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 16414af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgvoid Assembler::negl(Register dst) { 16424af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org EnsureSpace ensure_space(this); 16434af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit_optional_rex_32(dst); 16444af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit(0xF7); 16454af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org emit_modrm(0x3, dst); 16464af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org} 16474af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 16484af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org 1649755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::neg(const Operand& dst) { 1650755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1651755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1652755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1653755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(3, dst); 1654b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1655b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1656b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 165771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::nop() { 165871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 1659755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x90); 1660755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1661755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1662755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1663755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::not_(Register dst) { 1664755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1665755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1666755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1667e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x2, dst); 1668b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1669b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1670755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1671755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::not_(const Operand& dst) { 1672755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1673755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_rex_64(dst); 1674755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 1675755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(2, dst); 1676755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1677755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1678755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1679cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgvoid Assembler::notl(Register dst) { 1680cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org EnsureSpace ensure_space(this); 1681cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_optional_rex_32(dst); 1682cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit(0xF7); 1683cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org emit_modrm(0x2, dst); 1684cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} 1685cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 1686cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 168764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::Nop(int n) { 1688e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // The recommended muti-byte sequences of NOP instructions from the Intel 64 1689e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // and IA-32 Architectures Software Developer's Manual. 1690e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 1691e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Length Assembly Byte Sequence 1692e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 2 bytes 66 NOP 66 90H 1693e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 3 bytes NOP DWORD ptr [EAX] 0F 1F 00H 1694e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H 1695e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H 1696e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H 1697e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H 1698e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H 1699e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 66 0F 1F 84 00 00 00 00 1700e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // 00000000H] 00H 1701e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1702e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 170364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org while (n > 0) { 170464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org switch (n) { 170564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 2: 170664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 170764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 1: 170864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x90); 170964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 171064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 3: 171164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 171264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 171364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 171464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 171564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 4: 171664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 171764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 171864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x40); 171964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 172064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 172164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 6: 172264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 172364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 5: 172464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 172564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 172664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x44); 172764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 172864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 172964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 173064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 7: 173164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 173264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 173364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x80); 173464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 173564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 173664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 173764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 173864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return; 173964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org default: 174064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 11: 174164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 174264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 174364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 10: 174464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 174564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 174664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 9: 174764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x66); 174864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n--; 174964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org case 8: 175064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x0f); 175164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x1f); 175264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x84); 175364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 175464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 175564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 175664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 175764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0x00); 175864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org n -= 8; 175964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org } 1760e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1761e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1762e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1763e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 176471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::pop(Register dst) { 176571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 176640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst); 17675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x58 | dst.low_bits()); 1768b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1769b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1770b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 177171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::pop(const Operand& dst) { 177271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 177340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst); 1774755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0x8F); 1775755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(0, dst); 1776b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1777b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1778b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1779e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::popfq() { 1780e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1781e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x9D); 1782e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1783e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1784e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 178571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::push(Register src) { 178671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 178740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(src); 17885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x50 | src.low_bits()); 1789b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1790b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1791b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 179271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::push(const Operand& src) { 179371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 179440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(src); 1795755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xFF); 1796755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(6, src); 1797b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1798b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1799b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1800e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::push(Immediate value) { 1801e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1802e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (is_int8(value.value_)) { 1803e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x6A); 1804e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(value.value_); // Emit low byte of value. 1805e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 1806e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x68); 1807e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emitl(value.value_); 1808e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1809e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1810e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1811e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 18120ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgvoid Assembler::push_imm32(int32_t imm32) { 18130ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 18140ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x68); 18150ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emitl(imm32); 18160ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 18170ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 18180ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 1819e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::pushfq() { 1820e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1821e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x9C); 1822eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1823eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1824e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 182571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgvoid Assembler::ret(int imm16) { 182671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org EnsureSpace ensure_space(this); 182771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org ASSERT(is_uint16(imm16)); 182871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (imm16 == 0) { 1829755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC3); 183071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else { 1831755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xC2); 1832755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(imm16 & 0xFF); 1833755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit((imm16 >> 8) & 0xFF); 1834755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1835755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1836755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1837755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1838eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::setcc(Condition cc, Register reg) { 18399d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (cc > last_condition) { 18409d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com movb(reg, Immediate(cc == always ? 1 : 0)); 18419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return; 18429d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 1843eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 18445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(is_uint4(cc)); 184556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!reg.is_byte_register()) { // Use x64 byte registers, where different. 1846eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_rex_32(reg); 1847eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 1848eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x0F); 1849eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0x90 | cc); 1850eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_modrm(0x0, reg); 1851eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 1852eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1853eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1854e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shld(Register dst, Register src) { 1855e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1856e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 1857e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 1858e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA5); 1859e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(src, dst); 1860e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1861e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1862e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1863e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::shrd(Register dst, Register src) { 1864e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1865e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 1866e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x0F); 1867e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xAD); 1868e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(src, dst); 1869e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1870e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1871e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1872c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgvoid Assembler::xchgq(Register dst, Register src) { 1873e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1874e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if (src.is(rax) || dst.is(rax)) { // Single-byte encoding 1875e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org Register other = src.is(rax) ? dst : src; 1876e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(other); 18775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x90 | other.low_bits()); 18789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else if (dst.low_bits() == 4) { 18799dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_64(dst, src); 18809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x87); 18819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 1882e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } else { 1883e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(src, dst); 1884e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x87); 1885e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(src, dst); 1886e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 1887e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1888e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1889e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1890c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgvoid Assembler::xchgl(Register dst, Register src) { 1891c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org EnsureSpace ensure_space(this); 1892c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org if (src.is(rax) || dst.is(rax)) { // Single-byte encoding 1893c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org Register other = src.is(rax) ? dst : src; 1894c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_optional_rex_32(other); 1895c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x90 | other.low_bits()); 1896c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else if (dst.low_bits() == 4) { 1897c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_optional_rex_32(dst, src); 1898c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x87); 1899c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_modrm(dst, src); 1900c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else { 1901c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_optional_rex_32(src, dst); 1902c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x87); 1903c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_modrm(src, dst); 1904c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 1905c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 1906c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 1907c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 1908e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::store_rax(void* dst, RelocInfo::Mode mode) { 1909e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 1910e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x48); // REX.W 1911e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0xA3); 1912fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org emitp(dst, mode); 1913e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1914e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1915e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1916e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::store_rax(ExternalReference ref) { 1917e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org store_rax(ref.address(), RelocInfo::EXTERNAL_REFERENCE); 1918e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 1919e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 1920e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 19219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid Assembler::testb(Register dst, Register src) { 19229d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com EnsureSpace ensure_space(this); 19239dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 19249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_32(src, dst); 19259dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x84); 19269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 19279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 192856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!dst.is_byte_register() || !src.is_byte_register()) { 19299dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Register is not one of al, bl, cl, dl. Its encoding needs REX. 19309dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_32(dst, src); 19319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 19329dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x84); 19339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 19349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 19359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 19369d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 19379d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 1938755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testb(Register reg, Immediate mask) { 1939e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); 1940755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1941755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (reg.is(rax)) { 1942755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xA8); 194368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org emit(mask.value_); // Low byte emitted. 1944755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 194556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!reg.is_byte_register()) { 1946e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1947e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_32(reg); 1948755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1949755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF6); 1950e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, reg); 1951755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask.value_); // Low byte emitted. 1952755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 1953755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1954755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1955755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1956755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testb(const Operand& op, Immediate mask) { 1957e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org ASSERT(is_int8(mask.value_) || is_uint8(mask.value_)); 1958755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 1959755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_optional_rex_32(rax, op); 1960755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF6); 1961755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(rax, op); // Operation code 0 1962755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask.value_); // Low byte emitted. 1963755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 1964755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1965755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1966b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::testb(const Operand& op, Register reg) { 1967b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 196856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (!reg.is_byte_register()) { 1969b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Register is not one of al, bl, cl, dl. Its encoding needs REX. 1970b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_rex_32(reg, op); 1971b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 1972b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_optional_rex_32(reg, op); 1973b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 1974b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0x84); 1975b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_operand(reg, op); 1976b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 1977b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1978b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 197968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgvoid Assembler::testl(Register dst, Register src) { 198068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org EnsureSpace ensure_space(this); 19819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 19829dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(src, dst); 19839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 19849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 19859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 19869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_optional_rex_32(dst, src); 19879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 19889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 19899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 199068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org} 199168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 199268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 1993755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testl(Register reg, Immediate mask) { 1994911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // testl with a mask that fits in the low byte is exactly testb. 1995911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_uint8(mask.value_)) { 1996911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org testb(reg, mask); 1997911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return; 1998911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1999755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 2000755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (reg.is(rax)) { 2001755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xA9); 2002755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 2003755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 2004755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_optional_rex_32(rax, reg); 2005755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 2006e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_modrm(0x0, reg); 2007755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 2008755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 2009755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 2010755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2011755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2012755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::testl(const Operand& op, Immediate mask) { 2013911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // testl with a mask that fits in the low byte is exactly testb. 2014911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (is_uint8(mask.value_)) { 2015911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org testb(op, mask); 2016911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return; 2017911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 2018755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 2019755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_optional_rex_32(rax, op); 2020755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(0xF7); 2021755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit_operand(rax, op); // Operation code 0 2022755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org emit(mask); 2023755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 2024755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2025755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 2026c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgvoid Assembler::testl(const Operand& op, Register reg) { 2027c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org EnsureSpace ensure_space(this); 2028c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_optional_rex_32(reg, op); 2029c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit(0x85); 2030c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org emit_operand(reg, op); 2031c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 2032c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 2033c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 2034e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::testq(const Operand& op, Register reg) { 2035e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 2036e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_rex_64(reg, op); 2037e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit(0x85); 2038e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org emit_operand(reg, op); 2039e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 2040e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 2041e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 2042e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgvoid Assembler::testq(Register dst, Register src) { 2043e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org EnsureSpace ensure_space(this); 20449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (src.low_bits() == 4) { 20459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_64(src, dst); 20469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 20479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(src, dst); 20489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 20499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_rex_64(dst, src); 20509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit(0x85); 20519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com emit_modrm(dst, src); 20529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 2053e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org} 2054e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 2055e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 2056eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::testq(Register dst, Immediate mask) { 20573d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (is_uint8(mask.value_)) { 20583d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org testb(dst, mask); 20593d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return; 20603d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 2061eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org EnsureSpace ensure_space(this); 2062eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (dst.is(rax)) { 2063eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_rex_64(); 2064eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xA9); 2065eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(mask); 2066eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } else { 2067eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_rex_64(dst); 2068eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(0xF7); 2069eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit_modrm(0, dst); 2070eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org emit(mask); 2071eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 2072eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 2073eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2074eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 20755c838251403b0be9a882540f1922577abba4c872ager@chromium.org// FPU instructions. 20765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld(int i) { 20795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xD9, 0xC0, i); 20815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld1() { 20855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 20875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE8); 20885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20905aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20915aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fldz() { 20925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 20935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 20945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xEE); 20955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 20965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 20975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 2098ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::fldpi() { 2099ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2100ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xD9); 2101ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xEB); 2102ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2103ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2104ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fldln2() { 2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xD9); 2108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xED); 2109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 21125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld_s(const Operand& adr) { 21135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 211486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 21175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fld_d(const Operand& adr) { 21215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 212286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDD); 21245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 21255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fstp_s(const Operand& adr) { 21295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 213086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 21325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 21335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fstp_d(const Operand& adr) { 21375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 213886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDD); 21405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 21415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fstp(int index) { 21453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org ASSERT(is_uint3(index)); 21463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 21473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_farith(0xDD, 0xD8, index); 21483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 21493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fild_s(const Operand& adr) { 21525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 215386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 21555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(0, adr); 21565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fild_d(const Operand& adr) { 21605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 216186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 21635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(5, adr); 21645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fistp_s(const Operand& adr) { 21685aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 216986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 21715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(3, adr); 21725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fisttp_s(const Operand& adr) { 2176750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ASSERT(IsEnabled(SSE3)); 21775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 217886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 21805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(1, adr); 21815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 21835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 2184b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::fisttp_d(const Operand& adr) { 2185750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ASSERT(IsEnabled(SSE3)); 2186b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EnsureSpace ensure_space(this); 2187b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_optional_rex_32(adr); 2188b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit(0xDD); 2189b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org emit_operand(1, adr); 2190b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2191b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2192b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 21935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fist_s(const Operand& adr) { 21945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 219586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 21965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 21975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(2, adr); 21985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 21995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fistp_d(const Operand& adr) { 22025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 220386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 22045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 22053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit_operand(7, adr); 22065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fabs() { 22105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 22125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE1); 22135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fchs() { 22175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 22195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE0); 22205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fcos() { 22245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 22265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFF); 22275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsin() { 22315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 22335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFE); 22345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid Assembler::fptan() { 22381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org EnsureSpace ensure_space(this); 22391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org emit(0xD9); 22401b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org emit(0xF2); 22411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org} 22421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 22431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 2244a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fyl2x() { 2245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 2246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xD9); 2247a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emit(0xF1); 2248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 225164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::f2xm1() { 225264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 225364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xD9); 225464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xF0); 225564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 225664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 225764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 225864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fscale() { 225964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 226064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xD9); 226164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xFD); 226264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 226364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 226464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 226564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fninit() { 226664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org EnsureSpace ensure_space(this); 226764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xDB); 226864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org emit(0xE3); 226964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 227064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 227164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 22725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fadd(int i) { 22735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xC0, i); 22755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsub(int i) { 22795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xE8, i); 22815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fisub_s(const Operand& adr) { 22855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 228686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit_optional_rex_32(adr); 22875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDA); 22885aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_operand(4, adr); 22895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22905aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22915aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fmul(int i) { 22935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 22945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xC8, i); 22955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 22965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 22985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fdiv(int i) { 22995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDC, 0xF8, i); 23015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::faddp(int i) { 23055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xC0, i); 23075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsubp(int i) { 23115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xE8, i); 23135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fsubrp(int i) { 23175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xE0, i); 23195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fmulp(int i) { 23235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xC8, i); 23255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fdivp(int i) { 23295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDE, 0xF8, i); 23315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fprem() { 23355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 23375aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF8); 23385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23395aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fprem1() { 23425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 23445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF5); 23455aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fxch(int i) { 23495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23505aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xD9, 0xC8, i); 23515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fincstp() { 23555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 23575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xF7); 23585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::ffree(int i) { 23625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23635aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDD, 0xC0, i); 23645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23655aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::ftst() { 23685aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23695aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 23705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE4); 23715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fucomp(int i) { 23755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit_farith(0xDD, 0xE8, i); 23775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23795aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fucompp() { 23815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 23825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDA); 23835aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE9); 23845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 23855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 23873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomi(int i) { 23883811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 23893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xDB); 23903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xE8 + i); 23913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 23923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 23933811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 23943811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomip() { 23953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org EnsureSpace ensure_space(this); 23963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xDF); 23973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org emit(0xE9); 23983811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 23993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 24003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 24015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fcompp() { 24025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 24035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDE); 24045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 24055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fnstsw_ax() { 24095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 24105aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDF); 24115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE0); 24125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fwait() { 24165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 24175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0x9B); 24185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::frndint() { 24225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 24235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xD9); 24245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xFC); 24255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::fnclex() { 24295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org EnsureSpace ensure_space(this); 24305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xDB); 24315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(0xE2); 24325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 24353e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::sahf() { 24363e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // TODO(X64): Test for presence. Not all 64-bit intel CPU's have sahf 24373e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // in 64-bit mode. Test CpuID. 24383e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 24393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x9E); 24403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 24413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24423e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 24435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid Assembler::emit_farith(int b1, int b2, int i) { 24445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode 24455aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(is_uint3(i)); // illegal stack offset 24465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(b1); 24475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org emit(b2 + i); 24485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 24495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 2450e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2451ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org// SSE operations. 2452ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2453ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.orgvoid Assembler::andps(XMMRegister dst, XMMRegister src) { 2454ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org EnsureSpace ensure_space(this); 2455ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit_optional_rex_32(dst, src); 2456ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit(0x0F); 2457ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit(0x54); 2458ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org emit_sse_operand(dst, src); 2459ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org} 2460ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2461ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org 2462af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andps(XMMRegister dst, const Operand& src) { 2463af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2464af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2465af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2466af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x54); 2467af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2468af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2469af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2470af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2471057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Assembler::orps(XMMRegister dst, XMMRegister src) { 2472057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2473057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_optional_rex_32(dst, src); 2474057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x0F); 2475057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x56); 2476057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2477057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2478057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2479057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2480af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orps(XMMRegister dst, const Operand& src) { 2481af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2482af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2483af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2484af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x56); 2485af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2486af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2487af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2488af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2489057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Assembler::xorps(XMMRegister dst, XMMRegister src) { 2490057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org EnsureSpace ensure_space(this); 2491057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_optional_rex_32(dst, src); 2492057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x0F); 2493057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit(0x57); 2494057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org emit_sse_operand(dst, src); 2495057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 2496057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2497057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 2498af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::xorps(XMMRegister dst, const Operand& src) { 2499af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2500af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2501af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2502af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x57); 2503af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2504af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2505af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2506af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2507af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, XMMRegister src) { 2508af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2509af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2510af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2511af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x58); 2512af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2513af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2514af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2515af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2516af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, const Operand& src) { 2517af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2518af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2519af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2520af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x58); 2521af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2522af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2523af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2524af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2525af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, XMMRegister src) { 2526af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2527af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2528af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2529af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5C); 2530af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2531af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2532af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2533af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2534af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, const Operand& src) { 2535af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2536af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2537af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2538af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5C); 2539af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2540af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2541af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2542af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2543af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, XMMRegister src) { 2544af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2545af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2546af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2547af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x59); 2548af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2549af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2550af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2551af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2552af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, const Operand& src) { 2553af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2554af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2555af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2556af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x59); 2557af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2558af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2559af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2560af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2561af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, XMMRegister src) { 2562af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2563af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2564af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2565af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5E); 2566af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2567af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2568af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2569af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2570af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, const Operand& src) { 2571af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2572af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(dst, src); 2573af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2574af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x5E); 2575af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2576af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2577af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2578af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 25795c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SSE 2 operations. 25803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2581357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Assembler::movd(XMMRegister dst, Register src) { 2582357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org EnsureSpace ensure_space(this); 2583357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x66); 2584357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_optional_rex_32(dst, src); 2585357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x0F); 2586357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x6E); 2587357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_sse_operand(dst, src); 2588357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 2589357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2590357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2591ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movd(Register dst, XMMRegister src) { 2592ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2593ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2594e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_optional_rex_32(src, dst); 2595ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2596ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x7E); 2597e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_sse_operand(src, dst); 2598ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2599ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2600ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2601ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movq(XMMRegister dst, Register src) { 2602ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2603ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2604ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit_rex_64(dst, src); 2605ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2606ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x6E); 2607ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit_sse_operand(dst, src); 2608ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2609ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2610ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2611ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::movq(Register dst, XMMRegister src) { 2612ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2613ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2614e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_rex_64(src, dst); 2615ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2616ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x7E); 2617e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org emit_sse_operand(src, dst); 2618ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2619ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2620ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2621160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movq(XMMRegister dst, XMMRegister src) { 2622160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2623160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (dst.low_bits() == 4) { 2624160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Avoid unnecessary SIB byte. 2625160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0xf3); 2626160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2627160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2628160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x7e); 2629160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2630160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2631160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2632160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2633160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2634160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0xD6); 2635160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2636160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2637160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2638160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2639e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 26400ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgvoid Assembler::movdqa(const Operand& dst, XMMRegister src) { 26410ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 26420ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x66); 26430ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_rex_64(src, dst); 26440ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x0F); 26450ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x7F); 26460ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_sse_operand(src, dst); 26470ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 26480ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 26490ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 26500ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgvoid Assembler::movdqa(XMMRegister dst, const Operand& src) { 26510ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org EnsureSpace ensure_space(this); 26520ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x66); 26530ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_rex_64(dst, src); 26540ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x0F); 26550ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit(0x6F); 26560ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org emit_sse_operand(dst, src); 26570ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} 26580ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 26590ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 2660e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Assembler::movdqu(const Operand& dst, XMMRegister src) { 2661e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EnsureSpace ensure_space(this); 2662e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0xF3); 2663e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_rex_64(src, dst); 2664e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x0F); 2665e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x7F); 2666e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_sse_operand(src, dst); 2667e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2668e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2669e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2670e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Assembler::movdqu(XMMRegister dst, const Operand& src) { 2671e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org EnsureSpace ensure_space(this); 2672e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0xF3); 2673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_rex_64(dst, src); 2674e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x0F); 2675e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit(0x6F); 2676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org emit_sse_operand(dst, src); 2677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2680ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) { 2681b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org ASSERT(IsEnabled(SSE4_1)); 268264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org ASSERT(is_uint8(imm8)); 2683ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org EnsureSpace ensure_space(this); 2684ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x66); 2685b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org emit_optional_rex_32(src, dst); 2686ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x0F); 2687ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x3A); 2688ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0x17); 2689b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org emit_sse_operand(src, dst); 2690ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(imm8); 2691ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 2692ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 2693ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 26943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsd(const Operand& dst, XMMRegister src) { 26953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 26963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 26973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(src, dst); 26983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 26993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x11); // store 27003e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(src, dst); 27013e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27023e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27033e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::movsd(XMMRegister dst, XMMRegister src) { 27053e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27063e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 27073e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27083e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x10); // load 27103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::movsd(XMMRegister dst, const Operand& src) { 27153e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27163e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); // double 27173e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27183e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27193e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x10); // load 27203e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 27213e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27223e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 27233e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2724160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movaps(XMMRegister dst, XMMRegister src) { 2725160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2726160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (src.low_bits() == 4) { 2727160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Try to avoid an unnecessary SIB byte. 2728160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2729160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2730160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x29); 2731160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2732160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2733160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2734160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2735160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x28); 2736160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2737160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2738160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2739160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2740160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2741af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) { 2742af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org ASSERT(is_uint8(imm8)); 2743af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org EnsureSpace ensure_space(this); 2744af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_optional_rex_32(src, dst); 2745af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0x0F); 2746af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(0xC6); 2747af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit_sse_operand(dst, src); 2748af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org emit(imm8); 2749af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org} 2750af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2751af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org 2752160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::movapd(XMMRegister dst, XMMRegister src) { 2753160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 2754160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org if (src.low_bits() == 4) { 2755160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Try to avoid an unnecessary SIB byte. 2756160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2757160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(src, dst); 2758160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2759160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x29); 2760160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(src, dst); 2761160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } else { 2762160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 2763160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 2764160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0F); 2765160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x28); 2766160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 2767160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org } 2768160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2769160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2770160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 277140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::movss(XMMRegister dst, const Operand& src) { 277240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 277340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); // single 277440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 277540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 277640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x10); // load 277740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 277840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 277940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 278040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 278140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::movss(const Operand& src, XMMRegister dst) { 278240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 278340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); // single 278440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 278540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 278640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x11); // store 278740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 278840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 278940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 279040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 27913e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvttss2si(Register dst, const Operand& src) { 27923e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 27933e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF3); 27943e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 27953e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 27963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2C); 27973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 27983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 27993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28003e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28010a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid Assembler::cvttss2si(Register dst, XMMRegister src) { 28020a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org EnsureSpace ensure_space(this); 28030a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0xF3); 28040a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_optional_rex_32(dst, src); 28050a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x0F); 28060a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x2C); 28070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_sse_operand(dst, src); 28080a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 28090a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 28100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 28113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvttsd2si(Register dst, const Operand& src) { 28123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 28133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 28143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 28153e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 28163e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2C); 28173e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(dst, src); 28183e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 28193e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28203e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid Assembler::cvttsd2si(Register dst, XMMRegister src) { 28220a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org EnsureSpace ensure_space(this); 28230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0xF2); 28240a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_optional_rex_32(dst, src); 28250a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x0F); 28260a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit(0x2C); 28270a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org emit_sse_operand(dst, src); 28280a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 28290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 28300a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 2831dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgvoid Assembler::cvttsd2siq(Register dst, XMMRegister src) { 2832dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org EnsureSpace ensure_space(this); 2833dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0xF2); 2834dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit_rex_64(dst, src); 2835dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0x0F); 2836dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit(0x2C); 2837dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org emit_sse_operand(dst, src); 2838dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org} 2839dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 2840dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 28413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtlsi2sd(XMMRegister dst, const Operand& src) { 28423e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 28433e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 28443e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 28453e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 28463e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 28473e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 28483e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 28493e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28503e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtlsi2sd(XMMRegister dst, Register src) { 28523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 28533e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 28543e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 28553e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 28563e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 28573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 28583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 28593e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 286140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtlsi2ss(XMMRegister dst, Register src) { 286240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 286340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); 286440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 286540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 286640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2A); 286740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 286840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 286940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 287040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 28713e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::cvtqsi2sd(XMMRegister dst, Register src) { 28723e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 28733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 28743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_rex_64(dst, src); 28753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 28763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x2A); 28773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 28783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 28793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 28803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 2881357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { 2882357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org EnsureSpace ensure_space(this); 2883357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0xF3); 2884357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_optional_rex_32(dst, src); 2885357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x0F); 2886357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit(0x5A); 2887357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org emit_sse_operand(dst, src); 2888357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org} 2889357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 2890357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org 289140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, const Operand& src) { 289240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 289340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF3); 289440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 289540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 289640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x5A); 289740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 289840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 289940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 290040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 290140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { 290240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 290340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 290440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 290540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 290640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x5A); 290740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 290840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 290940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 291040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 291140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2si(Register dst, XMMRegister src) { 291240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 291340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 291440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 291540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 291640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2D); 291740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 291840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 291940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 292040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 292140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::cvtsd2siq(Register dst, XMMRegister src) { 292240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 292340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0xF2); 292440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_rex_64(dst, src); 292540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0F); 292640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2D); 292740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 292840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 292940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 293040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 29313e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::addsd(XMMRegister dst, XMMRegister src) { 29323e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 29333e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 29343e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 29353e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 29363e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x58); 29373e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 29383e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29411f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::addsd(XMMRegister dst, const Operand& src) { 29421f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 29431f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0xF2); 29441f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_optional_rex_32(dst, src); 29451f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x0F); 29461f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x58); 29471f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 29481f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 29491f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 29501f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 29513e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) { 29523e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 29533e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 29543e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 29553e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 29563e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x59); 29573e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 29583e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29593e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29603e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29611f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::mulsd(XMMRegister dst, const Operand& src) { 29621f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org EnsureSpace ensure_space(this); 29631f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0xF2); 29641f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_optional_rex_32(dst, src); 29651f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x0F); 29661f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit(0x59); 29671f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org emit_sse_operand(dst, src); 29681f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org} 29691f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 29701f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org 29713e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::subsd(XMMRegister dst, XMMRegister src) { 29723e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 29733e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 29743e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 29753e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 29763e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x5C); 29773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 29783e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29793e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29803e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29813e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::divsd(XMMRegister dst, XMMRegister src) { 29823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org EnsureSpace ensure_space(this); 29833e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0xF2); 29843e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_optional_rex_32(dst, src); 29853e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x0F); 29863e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit(0x5E); 29873e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_sse_operand(dst, src); 29883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 29893e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29903e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 29915d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.orgvoid Assembler::andpd(XMMRegister dst, XMMRegister src) { 29925d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org EnsureSpace ensure_space(this); 29935d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x66); 29945d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_optional_rex_32(dst, src); 29955d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x0F); 29965d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x54); 29975d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_sse_operand(dst, src); 29985d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org} 29995d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 30005d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 30015d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.orgvoid Assembler::orpd(XMMRegister dst, XMMRegister src) { 30025d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org EnsureSpace ensure_space(this); 30035d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x66); 30045d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_optional_rex_32(dst, src); 30055d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x0F); 30065d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit(0x56); 30075d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org emit_sse_operand(dst, src); 30085d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org} 30095d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 30105d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org 30115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::xorpd(XMMRegister dst, XMMRegister src) { 30125c838251403b0be9a882540f1922577abba4c872ager@chromium.org EnsureSpace ensure_space(this); 30135c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x66); 30145c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_optional_rex_32(dst, src); 30154111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x0F); 3016160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x57); 3017160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 3018160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 3019160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 3020160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 30214111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { 30224111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org EnsureSpace ensure_space(this); 30234111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0xF2); 30244111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit_optional_rex_32(dst, src); 30254111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x0F); 30264111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit(0x51); 30274111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org emit_sse_operand(dst, src); 30284111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org} 30294111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 30304111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 30315c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, XMMRegister src) { 30325c838251403b0be9a882540f1922577abba4c872ager@chromium.org EnsureSpace ensure_space(this); 30335c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x66); 30345c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_optional_rex_32(dst, src); 30355c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x0f); 30365c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit(0x2e); 30375c838251403b0be9a882540f1922577abba4c872ager@chromium.org emit_sse_operand(dst, src); 30385c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 30395c838251403b0be9a882540f1922577abba4c872ager@chromium.org 30403e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 304140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) { 304240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org EnsureSpace ensure_space(this); 304340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x66); 304440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_optional_rex_32(dst, src); 304540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x0f); 304640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit(0x2e); 304740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org emit_sse_operand(dst, src); 304840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 304940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 305040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 30511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { 30521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org EnsureSpace ensure_space(this); 30531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0xF2); 30541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit_optional_rex_32(dst, src); 30551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0x0F); 30561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0xC2); 30571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit_sse_operand(dst, src); 30581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org emit(0x01); // LT == 1 30591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 30601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 30611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3062160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, 3063160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org Assembler::RoundingMode mode) { 3064750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org ASSERT(IsEnabled(SSE4_1)); 3065160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org EnsureSpace ensure_space(this); 3066160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x66); 3067160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_optional_rex_32(dst, src); 3068160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0f); 3069160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x3a); 3070160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(0x0b); 3071160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit_sse_operand(dst, src); 3072160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Mask precision exeption. 3073160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org emit(static_cast<byte>(mode) | 0x8); 3074160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 3075160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 3076160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 307783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid Assembler::movmskpd(Register dst, XMMRegister src) { 307883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org EnsureSpace ensure_space(this); 307983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x66); 308083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit_optional_rex_32(dst, src); 308183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x0f); 308283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit(0x50); 308383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org emit_sse_operand(dst, src); 308483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 308583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 308640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 30874121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.orgvoid Assembler::movmskps(Register dst, XMMRegister src) { 30884121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org EnsureSpace ensure_space(this); 30894121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit_optional_rex_32(dst, src); 30904121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit(0x0f); 30914121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit(0x50); 30924121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org emit_sse_operand(dst, src); 30934121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org} 30944121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 30954121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org 30963e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 30973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org Register ireg = { reg.code() }; 30983e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org emit_operand(ireg, adr); 30993e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 31003e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 31013e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 31023e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { 310386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 31043e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 31053e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 3106e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 31073e87580939cb78c5802369f723680d4a16cc2902ager@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) { 310886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 31093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org} 31103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 3111e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3112ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) { 3113ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org emit(0xC0 | (dst.low_bits() << 3) | src.low_bits()); 3114ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 3115ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 31165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 31170511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comvoid Assembler::db(uint8_t data) { 31180511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com EnsureSpace ensure_space(this); 31190511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com emit(data); 31200511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 31210511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 31220511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 3123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::dd(uint32_t data) { 3124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org EnsureSpace ensure_space(this); 3125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emitl(data); 3126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 3127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31295c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Relocation information implementations. 3130755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 3131755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 31324cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org ASSERT(!RelocInfo::IsNone(rmode)); 3133d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com if (rmode == RelocInfo::EXTERNAL_REFERENCE) { 3134c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Don't record external references unless the heap will be serialized. 3135d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#ifdef DEBUG 3136d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com if (!Serializer::enabled()) { 3137d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com Serializer::TooLateToEnableNow(); 3138d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } 3139d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#endif 3140badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org if (!Serializer::enabled() && !emit_debug_code()) { 3141d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com return; 3142d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } 3143c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } else if (rmode == RelocInfo::CODE_AGE_SEQUENCE) { 3144c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org // Don't record psuedo relocation info for code age sequence mode. 3145c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return; 314671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 3147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RelocInfo rinfo(pc_, rmode, data, NULL); 3148755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org reloc_info_writer.Write(&rinfo); 3149755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 3150755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 3151e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3152755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Assembler::RecordJSReturn() { 3153f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 3154755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 3155755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org RecordRelocInfo(RelocInfo::JS_RETURN); 3156b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 3157b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3158755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 31592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgvoid Assembler::RecordDebugBreakSlot() { 3160f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org positions_recorder()->WriteRecordedPositions(); 31612356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org EnsureSpace ensure_space(this); 31622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 31632356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 31642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid Assembler::RecordComment(const char* msg, bool force) { 31673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (FLAG_code_comments || force) { 3168755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org EnsureSpace ensure_space(this); 3169755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 3170755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 3171755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 3172755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 3173755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 3174c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgconst int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | 31756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1 << RelocInfo::RUNTIME_ENTRY | 3176e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1 << RelocInfo::INTERNAL_REFERENCE | 3177e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1 << RelocInfo::CODE_AGE_SEQUENCE; 3178755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 31799dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 31809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.combool RelocInfo::IsCodedSpecially() { 31819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // The deserializer needs to know whether a pointer is specially coded. Being 31829dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // specially coded on x64 means that it is a relative 32 bit address, as used 31839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // by branch instructions. 31849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com return (1 << rmode_) & kApplyMask; 31859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 31869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 318771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} } // namespace v8::internal 31889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 31899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_X64 3190