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