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