143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Copyright (c) 1994-2006 Sun Microsystems Inc.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All Rights Reserved.
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// are met:
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistributions of source code must retain the above copyright notice,
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// this list of conditions and the following disclaimer.
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Redistribution in binary form must reproduce the above copyright
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer in the
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// documentation and/or other materials provided with the
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// distribution.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - Neither the name of Sun Microsystems or the names of contributors may
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// be used to endorse or promote products derived from this software without
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specific prior written permission.
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THE POSSIBILITY OF SUCH DAMAGE.
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The original source code covered by the above license above has been modified
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// significantly by Google Inc.
3556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8.h"
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32
409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "disassembler.h"
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "macro-assembler.h"
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "serialize.h"
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of CpuFeatures
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#ifdef DEBUG
52c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgbool CpuFeatures::initialized_ = false;
53c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#endif
54c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orguint64_t CpuFeatures::supported_ = 0;
55750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orguint64_t CpuFeatures::found_by_runtime_probing_only_ = 0;
5663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.orguint64_t CpuFeatures::cross_compile_ = 0;
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgExternalReference ExternalReference::cpu_features() {
60003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ASSERT(CpuFeatures::initialized_);
61003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  return ExternalReference(&CpuFeatures::supported_);
62003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
63003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
64003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
65a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgint IntelDoubleRegister::NumAllocatableRegisters() {
66a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (CpuFeatures::IsSupported(SSE2)) {
67a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return XMMRegister::kNumAllocatableRegisters;
68a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  } else {
69169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return X87Register::kNumAllocatableRegisters;
70a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
71a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
72a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
73a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
74a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgint IntelDoubleRegister::NumRegisters() {
75a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (CpuFeatures::IsSupported(SSE2)) {
76a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return XMMRegister::kNumRegisters;
77a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  } else {
78169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return X87Register::kNumRegisters;
79a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
80a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
81a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
82a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
83a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgconst char* IntelDoubleRegister::AllocationIndexToString(int index) {
84a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (CpuFeatures::IsSupported(SSE2)) {
85a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return XMMRegister::AllocationIndexToString(index);
86a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  } else {
87169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return X87Register::AllocationIndexToString(index);
88a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
89a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
90a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
91a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
92c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgvoid CpuFeatures::Probe() {
93c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  ASSERT(!initialized_);
94061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  ASSERT(supported_ == 0);
95c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#ifdef DEBUG
96c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  initialized_ = true;
97c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org#endif
98c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  if (Serializer::enabled()) {
99c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    supported_ |= OS::CpuFeaturesImpliedByPlatform();
100c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    return;  // No features if we might serialize.
101c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
102061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  uint64_t probed_features = 0;
1041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  CPU cpu;
1051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  if (cpu.has_sse41()) {
1061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    probed_features |= static_cast<uint64_t>(1) << SSE4_1;
107c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
1081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  if (cpu.has_sse3()) {
1091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    probed_features |= static_cast<uint64_t>(1) << SSE3;
110c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
1111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  if (cpu.has_sse2()) {
1121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    probed_features |= static_cast<uint64_t>(1) << SSE2;
1131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  }
1141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  if (cpu.has_cmov()) {
1151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    probed_features |= static_cast<uint64_t>(1) << CMOV;
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  // SAHF must be available in compat/legacy mode.
1191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  ASSERT(cpu.has_sahf());
1201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  probed_features |= static_cast<uint64_t>(1) << SAHF;
1211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
122750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  uint64_t platform_features = OS::CpuFeaturesImpliedByPlatform();
123750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  supported_ = probed_features | platform_features;
124750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  found_by_runtime_probing_only_ = probed_features & ~platform_features;
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
1297276f14ca716596e0a0d17539516370c1f453847kasper.lund// Implementation of Displacement
1307276f14ca716596e0a0d17539516370c1f453847kasper.lund
1317276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Displacement::init(Label* L, Type type) {
1327276f14ca716596e0a0d17539516370c1f453847kasper.lund  ASSERT(!L->is_bound());
1337276f14ca716596e0a0d17539516370c1f453847kasper.lund  int next = 0;
1347276f14ca716596e0a0d17539516370c1f453847kasper.lund  if (L->is_linked()) {
1357276f14ca716596e0a0d17539516370c1f453847kasper.lund    next = L->pos();
1367276f14ca716596e0a0d17539516370c1f453847kasper.lund    ASSERT(next > 0);  // Displacements must be at positions > 0
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1387276f14ca716596e0a0d17539516370c1f453847kasper.lund  // Ensure that we _never_ overflow the next field.
1397276f14ca716596e0a0d17539516370c1f453847kasper.lund  ASSERT(NextField::is_valid(Assembler::kMaximalBufferSize));
1407276f14ca716596e0a0d17539516370c1f453847kasper.lund  data_ = NextField::encode(next) | TypeField::encode(type);
1417276f14ca716596e0a0d17539516370c1f453847kasper.lund}
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of RelocInfo
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst int RelocInfo::kApplyMask =
149236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
150c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org    1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE |
151e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    1 << RelocInfo::DEBUG_BREAK_SLOT | 1 << RelocInfo::CODE_AGE_SEQUENCE;
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.combool RelocInfo::IsCodedSpecially() {
1559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // The deserializer needs to know whether a pointer is specially coded.  Being
1569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // specially coded on IA32 means that it is a relative address, as used by
1579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // branch instructions.  These are also the ones that need changing when a
1589dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // code object moves.
1599dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  return (1 << rmode_) & kApplyMask;
1609dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}
1619dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1629dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
163245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) {
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Patch the code at the current address with the supplied instructions.
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < instruction_count; i++) {
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    *(pc_ + i) = *(instructions + i);
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1684af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
1694af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Indicate that code has changed.
1704af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  CPU::FlushICache(pc_, instruction_count);
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Patch the code at the current PC with a call to the target address.
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Additional guard int3 instructions can be added if required.
176245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) {
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Call instruction takes up 5 bytes and int3 takes up one byte.
1784af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  static const int kCallCodeSize = 5;
1794af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  int code_size = kCallCodeSize + guard_bytes;
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1814af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Create a code patcher.
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  CodePatcher patcher(pc_, code_size);
1834af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
1844af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Add a label for checking the size of the code used for returning.
1854af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#ifdef DEBUG
1864af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  Label check_codesize;
1874af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  patcher.masm()->bind(&check_codesize);
1884af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org#endif
1894af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
1904af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Patch the code.
19159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  patcher.masm()->call(target, RelocInfo::NONE32);
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1934af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  // Check that the size of the code generated is as expected.
1944af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  ASSERT_EQ(kCallCodeSize,
1954af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org            patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize));
1964af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add the requested number of int3 instructions after the call.
1982356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  ASSERT_GE(guard_bytes, 0);
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < guard_bytes; i++) {
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    patcher.masm()->int3();
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of Operand
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
208236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) {
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [base + disp/r]
21059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base]
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(0, base);
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (base.is(esp)) set_sib(times_1, esp, base);
21459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base + disp8]
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(1, base);
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (base.is(esp)) set_sib(times_1, esp, base);
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_disp8(disp);
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base + disp/r]
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(2, base);
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (base.is(esp)) set_sib(times_1, esp, base);
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_dispr(disp, rmode);
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOperand::Operand(Register base,
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 Register index,
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 ScaleFactor scale,
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 int32_t disp,
232236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org                 RelocInfo::Mode rmode) {
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!index.is(esp));  // illegal addressing mode
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [base + index*scale + disp/r]
23559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base + index*scale]
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(0, esp);
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_sib(scale, index, base);
23959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base + index*scale + disp8]
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(1, esp);
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_sib(scale, index, base);
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_disp8(disp);
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // [base + index*scale + disp/r]
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_modrm(2, esp);
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_sib(scale, index, base);
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_dispr(disp, rmode);
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOperand::Operand(Register index,
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 ScaleFactor scale,
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 int32_t disp,
256236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org                 RelocInfo::Mode rmode) {
25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!index.is(esp));  // illegal addressing mode
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // [index*scale + disp/r]
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_modrm(0, esp);
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_sib(scale, index, ebp);
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_dispr(disp, rmode);
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Operand::is_reg(Register reg) const {
26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return ((buf_[0] & 0xF8) == 0xC0)  // addressing mode is register only.
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      && ((buf_[0] & 0x07) == reg.code());  // register codes match.
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
270c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
271c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Operand::is_reg_only() const {
272c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return (buf_[0] & 0xF8) == 0xC0;  // Addressing mode is register only.
273c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
274c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comRegister Operand::reg() const {
277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(is_reg_only());
278c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return Register::from_code(buf_[0] & 0x07);
279c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
280c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
281c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -----------------------------------------------------------------------------
2835c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Implementation of Assembler.
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Emit a single byte. Must always be inlined.
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define EMIT(x)                                 \
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  *pc_++ = (x)
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE
29165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void InitCoverageLog();
29265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
29365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
2948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size)
2958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    : AssemblerBase(isolate, buffer, buffer_size),
296e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      positions_recorder_(this) {
29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Clear the buffer in debug mode unless it was provided by the
29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // caller in which case we can't be sure it's okay to overwrite
29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // existing code in it; see CodePatcher::CodePatcher(...).
30065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef DEBUG
30165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (own_buffer_) {
3028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    memset(buffer_, 0xCC, buffer_size_);  // int3
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
30465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE
30965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  InitCoverageLog();
31065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::GetCode(CodeDesc* desc) {
3155c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Finalize code (at this point overflow() may be true, but the gap ensures
3165c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // that we are still not overlapping instructions and relocation info).
3175c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ASSERT(pc_ <= reloc_info_writer.pos());  // No overlap.
318f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Set up code descriptor.
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc->buffer = buffer_;
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc->buffer_size = buffer_size_;
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc->instr_size = pc_offset();
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
32337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  desc->origin = this;
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::Align(int m) {
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(IsPowerOf2(m));
32964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  int mask = m - 1;
33064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  int addr = pc_offset();
33164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Nop((m - (addr & mask)) & mask);
33264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
33364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
33464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
33564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool Assembler::IsNop(Address addr) {
33664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Address a = addr;
33764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  while (*a == 0x66) a++;
33864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (*a == 0x90) return true;
33964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (a[0] == 0xf && a[1] == 0x1f) return true;
34064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return false;
34164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
34264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
34364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
34464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::Nop(int bytes) {
34564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
34664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
34764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (!CpuFeatures::IsSupported(SSE2)) {
34864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    // Older CPUs that do not support SSE2 may not support multibyte NOP
34964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    // instructions.
35064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    for (; bytes > 0; bytes--) {
35164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      EMIT(0x90);
35264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    }
35364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    return;
35464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
35564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
35664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf
35764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  while (bytes > 0) {
35864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    switch (bytes) {
35964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 2:
36064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x66);
36164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 1:
36264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x90);
36364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        return;
36464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 3:
36564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0xf);
36664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x1f);
36764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
36864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        return;
36964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 4:
37064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0xf);
37164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x1f);
37264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x40);
37364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
37464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        return;
37564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 6:
37664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x66);
37764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 5:
37864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0xf);
37964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x1f);
38064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x44);
38164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
38264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
38364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        return;
38464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 7:
38564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0xf);
38664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x1f);
38764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x80);
38864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
38964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
39064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
39164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
39264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        return;
39364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      default:
39464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 11:
39564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x66);
39664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        bytes--;
39764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 10:
39864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x66);
39964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        bytes--;
40064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 9:
40164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x66);
40264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        bytes--;
40364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      case 8:
40464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0xf);
40564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x1f);
40664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0x84);
40764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
40864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
40964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
41064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
41164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        EMIT(0);
41264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org        bytes -= 8;
41364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    }
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgvoid Assembler::CodeTargetAlign() {
4195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  Align(16);  // Preferred alignment of jump targets on ia32.
4205ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org}
4215ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org
4225ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cpuid() {
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xA2);
42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pushad() {
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x60);
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::popad() {
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x61);
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pushfd() {
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x9C);
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::popfd() {
44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x9D);
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(const Immediate& x) {
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (x.is_int8()) {
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x6a);
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(x.x_);
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x68);
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(x);
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
466a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::push_imm32(int32_t imm32) {
467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EnsureSpace ensure_space(this);
468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0x68);
469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  emit(imm32);
470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
471a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
472a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(Register src) {
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x50 | src.code());
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::push(const Operand& src) {
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFF);
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(esi, src);
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pop(Register dst) {
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(reloc_info_writer.last_pc() != NULL);
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x58 | dst.code());
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::pop(const Operand& dst) {
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x8F);
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, dst);
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
500a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::enter(const Immediate& size) {
501a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
502a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0xC8);
503a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  emit_w(size);
504a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0);
505a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
506a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
507a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
508a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::leave() {
509a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
510a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0xC9);
511a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
512a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
513a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(Register dst, const Operand& src) {
51556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(dst.is_byte_register());
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x8A);
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(const Operand& dst, int8_t imm8) {
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xC6);
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, dst);
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(imm8);
52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_b(const Operand& dst, Register src) {
53156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(src.is_byte_register());
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x88);
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(src, dst);
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_w(Register dst, const Operand& src) {
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x66);
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x8B);
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov_w(const Operand& dst, Register src) {
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x66);
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x89);
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(src, dst);
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
554e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Assembler::mov_w(const Operand& dst, int16_t imm16) {
555e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  EnsureSpace ensure_space(this);
556e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  EMIT(0x66);
557e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  EMIT(0xC7);
558e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  emit_operand(eax, dst);
559e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  EMIT(static_cast<int8_t>(imm16 & 0xff));
560e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  EMIT(static_cast<int8_t>(imm16 >> 8));
561e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
562e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
563e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, int32_t imm32) {
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xB8 | dst.code());
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(imm32);
56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5713bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.orgvoid Assembler::mov(Register dst, const Immediate& x) {
5723bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  EnsureSpace ensure_space(this);
5733bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  EMIT(0xB8 | dst.code());
5743bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  emit(x);
5753bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org}
5763bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org
5773bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, Handle<Object> handle) {
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xB8 | dst.code());
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(handle);
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(Register dst, const Operand& src) {
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x8B);
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5923bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.orgvoid Assembler::mov(Register dst, Register src) {
5933bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  EnsureSpace ensure_space(this);
5943bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  EMIT(0x89);
5953bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  EMIT(0xC0 | src.code() << 3 | dst.code());
5963bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org}
5973bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org
5983bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, const Immediate& x) {
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xC7);
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, dst);
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(x);
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, Handle<Object> handle) {
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xC7);
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, dst);
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(handle);
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mov(const Operand& dst, Register src) {
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x89);
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(src, dst);
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsx_b(Register dst, const Operand& src) {
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xBE);
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsx_w(Register dst, const Operand& src) {
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xBF);
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movzx_b(Register dst, const Operand& src) {
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xB6);
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movzx_w(Register dst, const Operand& src) {
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xB7);
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) {
655750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(CMOV));
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
6575c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Opcode: 0f 40 + cc /r.
6584af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  EMIT(0x0F);
6594af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  EMIT(0x40 + cc);
6604af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  emit_operand(dst, src);
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
664ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::cld() {
665ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
666ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xFC);
667ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
668ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
669ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
6700c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::rep_movs() {
6710c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
6720c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0xF3);
6730c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0xA5);
6740c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
6750c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
6760c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
677ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::rep_stos() {
678ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
679ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xF3);
680ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xAB);
681ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
682ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
683ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
6849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comvoid Assembler::stos() {
6859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  EnsureSpace ensure_space(this);
6869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  EMIT(0xAB);
6879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}
6889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
6899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
6907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvoid Assembler::xchg(Register dst, Register src) {
6917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  EnsureSpace ensure_space(this);
6925c838251403b0be9a882540f1922577abba4c872ager@chromium.org  if (src.is(eax) || dst.is(eax)) {  // Single-byte encoding.
6937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    EMIT(0x90 | (src.is(eax) ? dst.code() : src.code()));
6947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else {
6957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    EMIT(0x87);
6967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    EMIT(0xC0 | src.code() << 3 | dst.code());
6977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
6987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
6997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
7007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::adc(Register dst, int32_t imm32) {
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(2, Operand(dst), Immediate(imm32));
70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::adc(Register dst, const Operand& src) {
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x13);
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::add(Register dst, const Operand& src) {
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x03);
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
721c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::add(const Operand& dst, Register src) {
722c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  EnsureSpace ensure_space(this);
723c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  EMIT(0x01);
724c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  emit_operand(src, dst);
725c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
726c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
727c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::add(const Operand& dst, const Immediate& x) {
7297c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  ASSERT(reloc_info_writer.last_pc() != NULL);
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(0, dst, x);
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(Register dst, int32_t imm32) {
7362ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  and_(dst, Immediate(imm32));
7372ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org}
7382ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
7392ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
7402ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgvoid Assembler::and_(Register dst, const Immediate& x) {
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
7422ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  emit_arith(4, Operand(dst), x);
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(Register dst, const Operand& src) {
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x23);
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(const Operand& dst, const Immediate& x) {
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(4, dst, x);
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::and_(const Operand& dst, Register src) {
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x21);
7623bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  emit_operand(src, dst);
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
766a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::cmpb(const Operand& op, int8_t imm8) {
767a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (op.is_reg(eax)) {
769c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    EMIT(0x3C);
770c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  } else {
771c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    EMIT(0x80);
772c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    emit_operand(edi, op);  // edi == 7
773c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
774a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(imm8);
775a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
776a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
777a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
778c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::cmpb(const Operand& op, Register reg) {
77956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(reg.is_byte_register());
780b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EnsureSpace ensure_space(this);
781b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EMIT(0x38);
782c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  emit_operand(reg, op);
783b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
784b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
785b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
786c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::cmpb(Register reg, const Operand& op) {
78756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(reg.is_byte_register());
788b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EnsureSpace ensure_space(this);
789b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EMIT(0x3A);
790c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  emit_operand(reg, op);
791b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
792b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
793b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
794a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::cmpw(const Operand& op, Immediate imm16) {
795a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ASSERT(imm16.is_int16());
796a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
797a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0x66);
798a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0x81);
799a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  emit_operand(edi, op);
800a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  emit_w(imm16);
801a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
802a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
803a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, int32_t imm32) {
80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(7, Operand(reg), Immediate(imm32));
80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, Handle<Object> handle) {
81143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(7, Operand(reg), Immediate(handle));
81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(Register reg, const Operand& op) {
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x3B);
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(reg, op);
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cmp(const Operand& op, const Immediate& imm) {
82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(7, op, imm);
82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8294af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgvoid Assembler::cmp(const Operand& op, Handle<Object> handle) {
8304af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  EnsureSpace ensure_space(this);
8314af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org  emit_arith(7, op, Immediate(handle));
8324af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org}
8334af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
8344af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org
83537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid Assembler::cmpb_al(const Operand& op) {
836a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
83737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  EMIT(0x38);  // CMP r/m8, r8
83837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  emit_operand(eax, op);  // eax has same code as register al.
839a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
840a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
84137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
84237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid Assembler::cmpw_ax(const Operand& op) {
843a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
84437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  EMIT(0x66);
84537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  EMIT(0x39);  // CMP r/m16, r16
84637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  emit_operand(eax, op);  // eax has same code as register ax.
847a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
848a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
849a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec_b(Register dst) {
85156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(dst.is_byte_register());
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFE);
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xC8 | dst.code());
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgvoid Assembler::dec_b(const Operand& dst) {
8594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  EnsureSpace ensure_space(this);
8604a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  EMIT(0xFE);
8614a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  emit_operand(ecx, dst);
8624a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org}
8634a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
8644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec(Register dst) {
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x48 | dst.code());
86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::dec(const Operand& dst) {
87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFF);
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ecx, dst);
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cdq() {
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x99);
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::idiv(Register src) {
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF8 | src.code());
88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8912abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.orgvoid Assembler::imul(Register reg) {
8922abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  EnsureSpace ensure_space(this);
8932abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  EMIT(0xF7);
8942abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  EMIT(0xE8 | reg.code());
8952abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
8962abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::imul(Register dst, const Operand& src) {
89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xAF);
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::imul(Register dst, Register src, int32_t imm32) {
90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (is_int8(imm32)) {
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x6B);
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC0 | dst.code() << 3 | src.code());
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(imm32);
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x69);
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC0 | dst.code() << 3 | src.code());
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(imm32);
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::inc(Register dst) {
92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x40 | dst.code());
92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
92643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::inc(const Operand& dst) {
92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
92843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFF);
92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, dst);
93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::lea(Register dst, const Operand& src) {
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x8D);
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mul(Register src) {
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE0 | src.code());
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::neg(Register dst) {
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD8 | dst.code());
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::not_(Register dst) {
95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD0 | dst.code());
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(Register dst, int32_t imm32) {
96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(1, Operand(dst), Immediate(imm32));
96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(Register dst, const Operand& src) {
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0B);
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(const Operand& dst, const Immediate& x) {
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(1, dst, x);
97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::or_(const Operand& dst, Register src) {
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x09);
9833bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  emit_operand(src, dst);
98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::rcl(Register dst, uint8_t imm8) {
98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint5(imm8));  // illegal shift count
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (imm8 == 1) {
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xD1);
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xD0 | dst.code());
99343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC1);
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xD0 | dst.code());
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(imm8);
99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.orgvoid Assembler::rcr(Register dst, uint8_t imm8) {
100226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  EnsureSpace ensure_space(this);
100326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  ASSERT(is_uint5(imm8));  // illegal shift count
100426c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  if (imm8 == 1) {
100526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    EMIT(0xD1);
100626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    EMIT(0xD8 | dst.code());
100726c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  } else {
100826c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    EMIT(0xC1);
100926c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    EMIT(0xD8 | dst.code());
101026c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org    EMIT(imm8);
101126c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org  }
101226c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org}
101326c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
1014e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1015e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid Assembler::ror(Register dst, uint8_t imm8) {
1016e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  EnsureSpace ensure_space(this);
1017e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  ASSERT(is_uint5(imm8));  // illegal shift count
1018e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (imm8 == 1) {
1019e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    EMIT(0xD1);
1020e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    EMIT(0xC8 | dst.code());
1021e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  } else {
1022e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    EMIT(0xC1);
1023e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    EMIT(0xC8 | dst.code());
1024e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    EMIT(imm8);
1025e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1026e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1027e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1028e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1029e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid Assembler::ror_cl(Register dst) {
1030e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  EnsureSpace ensure_space(this);
1031e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  EMIT(0xD3);
1032e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  EMIT(0xC8 | dst.code());
1033e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1034e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
103526c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sar(Register dst, uint8_t imm8) {
103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint5(imm8));  // illegal shift count
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (imm8 == 1) {
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xD1);
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xF8 | dst.code());
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC1);
104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xF8 | dst.code());
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(imm8);
104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1050c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Assembler::sar_cl(Register dst) {
105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD3);
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF8 | dst.code());
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sbb(Register dst, const Operand& src) {
105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x1B);
106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shld(Register dst, const Operand& src) {
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xA5);
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shl(Register dst, uint8_t imm8) {
107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
107443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint5(imm8));  // illegal shift count
107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (imm8 == 1) {
107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xD1);
107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xE0 | dst.code());
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC1);
108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xE0 | dst.code());
108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(imm8);
108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1086c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Assembler::shl_cl(Register dst) {
108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD3);
108943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE0 | dst.code());
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shrd(Register dst, const Operand& src) {
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xAD);
109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::shr(Register dst, uint8_t imm8) {
110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint5(imm8));  // illegal shift count
1104c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (imm8 == 1) {
1105c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    EMIT(0xD1);
1106c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    EMIT(0xE8 | dst.code());
1107c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  } else {
1108c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    EMIT(0xC1);
1109c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    EMIT(0xE8 | dst.code());
1110c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    EMIT(imm8);
1111c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1115a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::shr_cl(Register dst) {
1116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
1117c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  EMIT(0xD3);
1118a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0xE8 | dst.code());
1119a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
1120a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1121a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(const Operand& dst, const Immediate& x) {
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(5, dst, x);
112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(Register dst, const Operand& src) {
112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x2B);
113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sub(const Operand& dst, Register src) {
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x29);
11383bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org  emit_operand(src, dst);
113943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(Register reg, const Immediate& imm) {
11433d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
11443d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    test_b(reg, imm.x_);
11453d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    return;
11463d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  }
11473d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org
114843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
11493d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // This is not using emit_arith because test doesn't support
11503d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // sign-extension of 8-bit operands.
11513d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  if (reg.is(eax)) {
11523d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xA9);
115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
11543d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xF7);
11553d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xC0 | reg.code());
115643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
11573d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  emit(imm);
115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(Register reg, const Operand& op) {
116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
116343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x85);
116443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(reg, op);
116543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
116643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1168b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Assembler::test_b(Register reg, const Operand& op) {
116956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  CHECK(reg.is_byte_register());
1170b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EnsureSpace ensure_space(this);
1171b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EMIT(0x84);
1172b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  emit_operand(reg, op);
1173b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
1174b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1175b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::test(const Operand& op, const Immediate& imm) {
1177594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (op.is_reg_only()) {
1178594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    test(op.reg(), imm);
1179594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return;
1180594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
11813d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
11823d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    return test_b(op, imm.x_);
11833d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  }
118443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
118643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, op);
118743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit(imm);
118843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
118943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
119043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11913d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.orgvoid Assembler::test_b(Register reg, uint8_t imm8) {
11923d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  EnsureSpace ensure_space(this);
11933d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // Only use test against byte for registers that have a byte
11943d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // variant: eax, ebx, ecx, and edx.
11953d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  if (reg.is(eax)) {
11963d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xA8);
11973d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(imm8);
11983d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  } else if (reg.is_byte_register()) {
11993d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    emit_arith_b(0xF6, 0xC0, reg, imm8);
12003d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  } else {
12013d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xF7);
12023d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    EMIT(0xC0 | reg.code());
12033d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    emit(imm8);
12043d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  }
12053d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org}
12063d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org
12073d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org
12081af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::test_b(const Operand& op, uint8_t imm8) {
12093d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  if (op.is_reg_only()) {
12103d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    test_b(op.reg(), imm8);
1211c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return;
1212c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
12131af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EnsureSpace ensure_space(this);
12141af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0xF6);
12151af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  emit_operand(eax, op);
12161af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(imm8);
12171af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org}
12181af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
12191af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
122043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(Register dst, int32_t imm32) {
122143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
122243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(6, Operand(dst), Immediate(imm32));
122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
122443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(Register dst, const Operand& src) {
122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x33);
122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Assembler::xor_(const Operand& dst, Register src) {
123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x31);
1236c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  emit_operand(src, dst);
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::xor_(const Operand& dst, const Immediate& x) {
124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
124243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_arith(6, dst, x);
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
124543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1246a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid Assembler::bt(const Operand& dst, Register src) {
1247a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EnsureSpace ensure_space(this);
1248a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0x0F);
1249a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  EMIT(0xA3);
1250a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  emit_operand(src, dst);
1251a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
1252a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1253a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bts(const Operand& dst, Register src) {
125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xAB);
125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(src, dst);
125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::hlt() {
126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF4);
126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::int3() {
126943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
127043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xCC);
127143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::nop() {
127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
127643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x90);
127743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
127843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
128043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ret(int imm16) {
128143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
128243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint16(imm16));
128343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (imm16 == 0) {
128443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC3);
128543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
128643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xC2);
128743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(imm16 & 0xFF);
128843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT((imm16 >> 8) & 0xFF);
128943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
129043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
129143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Labels refer to positions in the (to be) generated code.
129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// There are bound, linked, and unused labels.
129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Bound labels refer to known positions in the already
129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// generated code. pos() is the position the label refers to.
129843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
129943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Linked labels refer to unknown positions in the code
130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// to be generated; pos() is the position of the 32bit
130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Displacement of the last instruction using the label.
130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::print(Label* L) {
130543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (L->is_unused()) {
130643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("unused label\n");
130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (L->is_bound()) {
130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("bound label to %d\n", L->pos());
130943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (L->is_linked()) {
131043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Label l = *L;
131143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("unbound label");
131243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    while (l.is_linked()) {
131343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Displacement disp = disp_at(&l);
131443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      PrintF("@ %d ", l.pos());
131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      disp.print();
131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      PrintF("\n");
131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      disp.next(&l);
131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("label in inconsistent state (pos = %d)\n", L->pos_);
132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
132343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bind_to(Label* L, int pos) {
132643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
132743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(0 <= pos && pos <= pc_offset());  // must have a valid binding position
132843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  while (L->is_linked()) {
132943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Displacement disp = disp_at(L);
133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int fixup_pos = L->pos();
1331a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    if (disp.type() == Displacement::CODE_RELATIVE) {
1332a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      // Relative to Code* heap object pointer.
1333a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag);
1334a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    } else {
1335a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      if (disp.type() == Displacement::UNCONDITIONAL_JUMP) {
1336a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org        ASSERT(byte_at(fixup_pos - 1) == 0xE9);  // jmp expected
1337a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      }
13385c838251403b0be9a882540f1922577abba4c872ager@chromium.org      // Relative address, relative to point after address.
1339a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      int imm32 = pos - (fixup_pos + sizeof(int32_t));
1340a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      long_at_put(fixup_pos, imm32);
134143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    disp.next(L);
134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
134483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  while (L->is_near_linked()) {
134583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    int fixup_pos = L->near_link_pos();
134683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    int offset_to_next =
134783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org        static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos)));
134883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    ASSERT(offset_to_next <= 0);
134983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    // Relative address, relative to point after address.
135083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    int disp = pos - fixup_pos - sizeof(int8_t);
13519c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.org    CHECK(0 <= disp && disp <= 127);
135283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    set_byte_at(fixup_pos, disp);
135383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    if (offset_to_next < 0) {
135483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      L->link_to(fixup_pos + offset_to_next, Label::kNear);
135583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    } else {
135683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      L->UnuseNear();
135783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    }
135883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
135943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  L->bind_to(pos);
136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
136143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::bind(Label* L) {
136443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!L->is_bound());  // label can only be bound once
136643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bind_to(L, pc_offset());
136743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
136843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
137043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::call(Label* L) {
1371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  positions_recorder()->WriteRecordedPositions();
137243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (L->is_bound()) {
137443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int long_size = 5;
137543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int offs = L->pos() - pc_offset();
137643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(offs <= 0);
13775c838251403b0be9a882540f1922577abba4c872ager@chromium.org    // 1110 1000 #32-bit disp.
137843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xE8);
137943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(offs - long_size);
138043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
13815c838251403b0be9a882540f1922577abba4c872ager@chromium.org    // 1110 1000 #32-bit disp.
138243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xE8);
138343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit_disp(L, Displacement::OTHER);
138443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
138543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
138643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
138743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1388236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) {
1389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  positions_recorder()->WriteRecordedPositions();
139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
1391236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  ASSERT(!RelocInfo::IsCodeTarget(rmode));
139243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE8);
13936e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  if (RelocInfo::IsRuntimeEntry(rmode)) {
13946e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(reinterpret_cast<uint32_t>(entry), rmode);
13956e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  } else {
13966e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(entry - (pc_ + sizeof(int32_t)), rmode);
13976e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
139843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
139943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1401fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgint Assembler::CallSize(const Operand& adr) {
1402fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  // Call size is 1 (opcode) + adr.len_ (operand).
1403fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  return 1 + adr.len_;
1404fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org}
1405fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
1406fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
140743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::call(const Operand& adr) {
1408a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  positions_recorder()->WriteRecordedPositions();
140943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
141043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFF);
141143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(edx, adr);
1412fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org}
1413fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
1414fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
1415fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) {
1416fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  return 1 /* EMIT */ + sizeof(uint32_t) /* emit */;
141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14208e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid Assembler::call(Handle<Code> code,
14218e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org                     RelocInfo::Mode rmode,
1422471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                     TypeFeedbackId ast_id) {
1423f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  positions_recorder()->WriteRecordedPositions();
142443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
1425c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  ASSERT(RelocInfo::IsCodeTarget(rmode)
1426c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org      || rmode == RelocInfo::CODE_AGE_SEQUENCE);
142743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE8);
142832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  emit(code, rmode, ast_id);
142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
143043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid Assembler::jmp(Label* L, Label::Distance distance) {
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (L->is_bound()) {
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int short_size = 2;
143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int long_size  = 5;
143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int offs = L->pos() - pc_offset();
143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(offs <= 0);
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (is_int8(offs - short_size)) {
14405c838251403b0be9a882540f1922577abba4c872ager@chromium.org      // 1110 1011 #8-bit disp.
144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT(0xEB);
144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT((offs - short_size) & 0xFF);
144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
14445c838251403b0be9a882540f1922577abba4c872ager@chromium.org      // 1110 1001 #32-bit disp.
144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT(0xE9);
144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      emit(offs - long_size);
144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
144883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  } else if (distance == Label::kNear) {
144983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    EMIT(0xEB);
145083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    emit_near_disp(L);
145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
14525c838251403b0be9a882540f1922577abba4c872ager@chromium.org    // 1110 1001 #32-bit disp.
145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0xE9);
145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
145643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
145743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1459236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
146043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
1461236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  ASSERT(!RelocInfo::IsCodeTarget(rmode));
146243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE9);
14636e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  if (RelocInfo::IsRuntimeEntry(rmode)) {
14646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(reinterpret_cast<uint32_t>(entry), rmode);
14656e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  } else {
14666e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(entry - (pc_ + sizeof(int32_t)), rmode);
14676e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::jmp(const Operand& adr) {
147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFF);
147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(esp, adr);
147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1478236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) {
147943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
1480236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  ASSERT(RelocInfo::IsCodeTarget(rmode));
148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE9);
148232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  emit(code, rmode);
148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
148443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) {
148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
148872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  ASSERT(0 <= cc && static_cast<int>(cc) < 16);
148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (L->is_bound()) {
149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int short_size = 2;
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int long_size  = 6;
149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int offs = L->pos() - pc_offset();
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(offs <= 0);
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (is_int8(offs - short_size)) {
149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // 0111 tttn #8-bit disp
149643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT(0x70 | cc);
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT((offs - short_size) & 0xFF);
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // 0000 1111 1000 tttn #32-bit disp
150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT(0x0F);
150143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      EMIT(0x80 | cc);
150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      emit(offs - long_size);
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
150483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  } else if (distance == Label::kNear) {
150583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    EMIT(0x70 | cc);
150683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    emit_near_disp(L);
150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // 0000 1111 1000 tttn #32-bit disp
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Note: could eliminate cond. jumps to this jump if condition
151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    //       is the same however, seems to be rather unlikely case.
151143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x0F);
151243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x80 | cc);
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit_disp(L, Displacement::OTHER);
151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
151543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) {
151943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
152072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  ASSERT((0 <= cc) && (static_cast<int>(cc) < 16));
15215c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // 0000 1111 1000 tttn #32-bit disp.
152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
152343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x80 | cc);
15246e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  if (RelocInfo::IsRuntimeEntry(rmode)) {
15256e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(reinterpret_cast<uint32_t>(entry), rmode);
15266e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  } else {
15276e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    emit(entry - (pc_ + sizeof(int32_t)), rmode);
15286e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
152943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
153043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Assembler::j(Condition cc, Handle<Code> code) {
153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // 0000 1111 1000 tttn #32-bit disp
153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
153643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x80 | cc);
153732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  emit(code, RelocInfo::CODE_TARGET);
153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15415c838251403b0be9a882540f1922577abba4c872ager@chromium.org// FPU instructions.
154243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld(int i) {
154443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
154543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xD9, 0xC0, i);
154643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
154743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1549ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fstp(int i) {
1550ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
1551ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_farith(0xDD, 0xD8, i);
1552ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
1553ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1554ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
155543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld1() {
155643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
155743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
155843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE8);
155943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
156043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1562ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fldpi() {
1563ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
1564ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xD9);
1565ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xEB);
1566ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
1567ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1568ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
156943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fldz() {
157043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
157143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
157243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xEE);
157343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
157443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
157543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fldln2() {
1577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EnsureSpace ensure_space(this);
1578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0xD9);
1579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0xED);
1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
158343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld_s(const Operand& adr) {
158443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
158543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
158643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, adr);
158743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
158943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
159043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fld_d(const Operand& adr) {
159143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
159243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDD);
159343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, adr);
159443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
159543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
159643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
159743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fstp_s(const Operand& adr) {
159843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
159943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
160043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ebx, adr);
160143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
160243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
160343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
160432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgvoid Assembler::fst_s(const Operand& adr) {
160532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  EnsureSpace ensure_space(this);
160632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  EMIT(0xD9);
160732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  emit_operand(edx, adr);
160832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org}
160932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org
161032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org
161143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fstp_d(const Operand& adr) {
161243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
161343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDD);
161443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ebx, adr);
161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
161643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1618ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::fst_d(const Operand& adr) {
1619ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
1620ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xDD);
1621ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_operand(edx, adr);
1622ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
1623ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1624ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fild_s(const Operand& adr) {
162643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
162743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDB);
162843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(eax, adr);
162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
163043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fild_d(const Operand& adr) {
163343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
163443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDF);
163543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ebp, adr);
163643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
163743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fistp_s(const Operand& adr) {
164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
164143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDB);
164243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ebx, adr);
164343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
164443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1646061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgvoid Assembler::fisttp_s(const Operand& adr) {
1647750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE3));
1648061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  EnsureSpace ensure_space(this);
1649061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  EMIT(0xDB);
1650061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  emit_operand(ecx, adr);
1651061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
1652061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1653061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
16540c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::fisttp_d(const Operand& adr) {
1655750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE3));
16560c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
16570c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0xDD);
16580c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  emit_operand(ecx, adr);
16590c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
16600c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
16610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
166243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fist_s(const Operand& adr) {
166343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
166443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDB);
166543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(edx, adr);
166643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
166743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fistp_d(const Operand& adr) {
167043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
167143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDF);
167243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(edi, adr);
167343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
167443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
167543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
167643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fabs() {
167743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
167843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE1);
168043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fchs() {
168443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
168543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
168643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE0);
168743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
168843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1690eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::fcos() {
1691eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EnsureSpace ensure_space(this);
1692eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EMIT(0xD9);
1693eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EMIT(0xFF);
1694eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
1695eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1696eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1697eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgvoid Assembler::fsin() {
1698eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EnsureSpace ensure_space(this);
1699eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EMIT(0xD9);
1700eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  EMIT(0xFE);
1701eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
1702eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1703eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
17041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid Assembler::fptan() {
17051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  EnsureSpace ensure_space(this);
17061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  EMIT(0xD9);
17071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  EMIT(0xF2);
17081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
17091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
17101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
1711a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::fyl2x() {
1712a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EnsureSpace ensure_space(this);
1713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0xD9);
1714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0xF1);
1715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
171864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::f2xm1() {
171964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
172064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xD9);
172164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xF0);
172264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
172364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
172464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
172564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fscale() {
172664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
172764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xD9);
172864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xFD);
172964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
173064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
173164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
173264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::fninit() {
173364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
173464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xDB);
173564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0xE3);
173664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
173764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
173864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
173943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fadd(int i) {
174043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDC, 0xC0, i);
174243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1745c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fadd_i(int i) {
1746c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  EnsureSpace ensure_space(this);
1747c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  emit_farith(0xD8, 0xC0, i);
1748c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org}
1749c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
1750c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
175143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsub(int i) {
175243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
175343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDC, 0xE8, i);
175443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
175543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
175643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1757c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fsub_i(int i) {
1758c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  EnsureSpace ensure_space(this);
1759c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  emit_farith(0xD8, 0xE0, i);
1760c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org}
1761c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
1762c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
176343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fisub_s(const Operand& adr) {
176443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
176543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDA);
176643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(esp, adr);
176743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
176843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
176943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1770169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgvoid Assembler::fmul_i(int i) {
1771169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  EnsureSpace ensure_space(this);
1772169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  emit_farith(0xD8, 0xC8, i);
1773169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org}
1774169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
1775169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
177643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fmul(int i) {
177743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
177843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDC, 0xC8, i);
177943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
178043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
178143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
178243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fdiv(int i) {
178343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
178443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDC, 0xF8, i);
178543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
178643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
178743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1788c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid Assembler::fdiv_i(int i) {
1789c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  EnsureSpace ensure_space(this);
1790c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  emit_farith(0xD8, 0xF0, i);
1791c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org}
1792c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
1793c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
179443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::faddp(int i) {
179543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
179643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDE, 0xC0, i);
179743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
179843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
179943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
180043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsubp(int i) {
180143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
180243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDE, 0xE8, i);
180343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
180443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
180543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
180643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fsubrp(int i) {
180743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
180843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDE, 0xE0, i);
180943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
181043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
181143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
181243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fmulp(int i) {
181343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
181443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDE, 0xC8, i);
181543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
181643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
181743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
181843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fdivp(int i) {
181943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
182043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDE, 0xF8, i);
182143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
182243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
182343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
182443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fprem() {
182543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
182643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
182743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF8);
182843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
182943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fprem1() {
183243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
183443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF5);
183543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
183643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
183843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fxch(int i) {
183943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
184043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xD9, 0xC8, i);
184143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
184243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fincstp() {
184543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
184643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
184743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF7);
184843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
184943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ffree(int i) {
185243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
185343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDD, 0xC0, i);
185443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
185543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::ftst() {
185843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
185943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
186043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE4);
186143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
186243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fucomp(int i) {
186543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
186643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_farith(0xDD, 0xE8, i);
186743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
186843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fucompp() {
187143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
187243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDA);
187343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE9);
187443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
187543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
187643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18773811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomi(int i) {
18783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EnsureSpace ensure_space(this);
18793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EMIT(0xDB);
18803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EMIT(0xE8 + i);
18813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
18823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
18833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
18843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid Assembler::fucomip() {
18853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EnsureSpace ensure_space(this);
18863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EMIT(0xDF);
18873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  EMIT(0xE9);
18883811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
18893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
18903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
189143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fcompp() {
189243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
189343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xDE);
189443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
189543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
189643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
189743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
189843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fnstsw_ax() {
189943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
19005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  EMIT(0xDF);
190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xE0);
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::fwait() {
190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x9B);
190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
190943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
191043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
191143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::frndint() {
191243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
191343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xD9);
191443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xFC);
191543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
191743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1918061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgvoid Assembler::fnclex() {
1919061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  EnsureSpace ensure_space(this);
1920061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  EMIT(0xDB);
1921061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  EMIT(0xE2);
1922061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
1923061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1924061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
192543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::sahf() {
192643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
192743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x9E);
192843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvoid Assembler::setcc(Condition cc, Register reg) {
19327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  ASSERT(reg.is_byte_register());
19337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  EnsureSpace ensure_space(this);
19347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  EMIT(0x0F);
19357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  EMIT(0x90 | cc);
19367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  EMIT(0xC0 | reg.code());
19377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
19387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
19397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvttss2si(Register dst, const Operand& src) {
1941750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
194243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF3);
194443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
194543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x2C);
194643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
194843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
194943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
195043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvttsd2si(Register dst, const Operand& src) {
1951750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
195243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
195443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
195543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x2C);
195643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(dst, src);
195743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
195943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
196046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid Assembler::cvtsd2si(Register dst, XMMRegister src) {
1961750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
196246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EnsureSpace ensure_space(this);
196346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EMIT(0xF2);
196446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EMIT(0x0F);
196546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  EMIT(0x2D);
196646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  emit_sse_operand(dst, src);
196746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
196846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
196946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
197043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
1971750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
197243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
197343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
197543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x2A);
197643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
197743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
197843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
197943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1980ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
1981750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
1982ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
1983ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xF3);
1984ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
1985ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x5A);
1986ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
1987ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
1988ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
1989ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
19907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
1991750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
19927979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EnsureSpace ensure_space(this);
19937979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0xF2);
19947979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x0F);
19957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x5A);
19967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  emit_sse_operand(dst, src);
19977979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org}
19987979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
19997979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::addsd(XMMRegister dst, XMMRegister src) {
2001750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
200243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
200343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
200443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
200543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x58);
200643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
200743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
200843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
200943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20101f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::addsd(XMMRegister dst, const Operand& src) {
2011750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
20121f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EnsureSpace ensure_space(this);
20131f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0xF2);
20141f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0x0F);
20151f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0x58);
20161f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  emit_sse_operand(dst, src);
20171f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org}
20181f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
20191f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
202043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) {
2021750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
202243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
202343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
202443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
202543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x59);
202643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
202743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
202843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
202943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20301f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::mulsd(XMMRegister dst, const Operand& src) {
2031750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
20321f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EnsureSpace ensure_space(this);
20331f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0xF2);
20341f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0x0F);
20351f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  EMIT(0x59);
20361f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  emit_sse_operand(dst, src);
20371f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org}
20381f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
20391f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
204043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::subsd(XMMRegister dst, XMMRegister src) {
2041750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
204343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
204443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
204543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x5C);
204643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
204743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
204843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
204943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::divsd(XMMRegister dst, XMMRegister src) {
2051750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
205243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
205343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);
205443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
205543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x5E);
205643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
205743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
205843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
205943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2060846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.orgvoid Assembler::xorpd(XMMRegister dst, XMMRegister src) {
2061750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2062846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org  EnsureSpace ensure_space(this);
2063846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org  EMIT(0x66);
2064846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org  EMIT(0x0F);
2065846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org  EMIT(0x57);
2066846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org  emit_sse_operand(dst, src);
2067846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org}
2068846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org
2069846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org
2070af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andps(XMMRegister dst, const Operand& src) {
2071af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2072057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EnsureSpace ensure_space(this);
2073057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EMIT(0x0F);
2074057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EMIT(0x54);
2075057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  emit_sse_operand(dst, src);
2076057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org}
2077057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
2078057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
2079af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orps(XMMRegister dst, const Operand& src) {
2080af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2081057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EnsureSpace ensure_space(this);
2082057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EMIT(0x0F);
2083057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  EMIT(0x56);
2084057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  emit_sse_operand(dst, src);
2085057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org}
2086057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
2087057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
2088af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::xorps(XMMRegister dst, const Operand& src) {
2089af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2090fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  EnsureSpace ensure_space(this);
2091fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  EMIT(0x0F);
2092fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  EMIT(0x57);
2093fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org  emit_sse_operand(dst, src);
2094fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org}
2095fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2096fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org
2097af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::addps(XMMRegister dst, const Operand& src) {
20980fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  ASSERT(IsEnabled(SSE2));
2099ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
2100ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
2101af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x58);
2102ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
2103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2104ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2105ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2106af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::subps(XMMRegister dst, const Operand& src) {
21070fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  ASSERT(IsEnabled(SSE2));
2108c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EnsureSpace ensure_space(this);
2109c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x0F);
2110af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x5C);
2111c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  emit_sse_operand(dst, src);
2112c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
2113c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2114c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2115af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::mulps(XMMRegister dst, const Operand& src) {
2116af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2117af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EnsureSpace ensure_space(this);
2118af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x0F);
2119af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x59);
2120af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  emit_sse_operand(dst, src);
2121af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
2122af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2123af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2124af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::divps(XMMRegister dst, const Operand& src) {
2125af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2126af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EnsureSpace ensure_space(this);
2127af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x0F);
2128af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x5E);
2129af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  emit_sse_operand(dst, src);
2130af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
2131af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2132af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2133af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
2134af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2135af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EnsureSpace ensure_space(this);
2136af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0xF2);
2137af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x0F);
2138af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x51);
2139af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  emit_sse_operand(dst, src);
2140af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
2141af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2142af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2143af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::andpd(XMMRegister dst, XMMRegister src) {
21440fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org  ASSERT(IsEnabled(SSE2));
2145471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  EnsureSpace ensure_space(this);
2146471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  EMIT(0x66);
2147471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  EMIT(0x0F);
2148af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x54);
2149471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  emit_sse_operand(dst, src);
2150471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2151471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2152471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2153af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::orpd(XMMRegister dst, XMMRegister src) {
2154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2155ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
2156ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x66);
2157ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
2158af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x56);
2159ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
2160ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2161ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2162ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
216364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) {
2164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
216564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
216664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x66);
216764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x0F);
216864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x2E);
216964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  emit_sse_operand(dst, src);
217064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
217164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
217264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
21734acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2174750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
21754acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EnsureSpace ensure_space(this);
21764acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EMIT(0x66);
21774acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EMIT(0x0F);
21784acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EMIT(0x3A);
21794acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EMIT(0x0B);
21804acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  emit_sse_operand(dst, src);
21814acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  // Mask precision exeption.
21824acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  EMIT(static_cast<byte>(mode) | 0x8);
21834acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org}
21844acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
2185e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2186f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgvoid Assembler::movmskpd(Register dst, XMMRegister src) {
2187750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2188f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  EnsureSpace ensure_space(this);
2189f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  EMIT(0x66);
2190f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  EMIT(0x0F);
2191f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  EMIT(0x50);
2192f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  emit_sse_operand(dst, src);
2193f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
2194f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
2195f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
21964121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.orgvoid Assembler::movmskps(Register dst, XMMRegister src) {
2197750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
21984121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org  EnsureSpace ensure_space(this);
21994121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org  EMIT(0x0F);
22004121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org  EMIT(0x50);
22014121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org  emit_sse_operand(dst, src);
22024121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org}
22034121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org
22044121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org
220533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvoid Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
2206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
220733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  EnsureSpace ensure_space(this);
220833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  EMIT(0x66);
220933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  EMIT(0x0F);
221033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  EMIT(0x76);
221133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  emit_sse_operand(dst, src);
221233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
221333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
221433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2215c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
2216750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2217c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EnsureSpace ensure_space(this);
2218c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0xF2);
2219c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x0F);
2220c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0xC2);
2221c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  emit_sse_operand(dst, src);
2222c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(1);  // LT == 1
2223c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
2224c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2225c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2226c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::movaps(XMMRegister dst, XMMRegister src) {
2227750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2228c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EnsureSpace ensure_space(this);
2229c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x0F);
2230c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x28);
2231c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  emit_sse_operand(dst, src);
2232c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
2233c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2234c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2235af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.orgvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
2236af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(IsEnabled(SSE2));
2237af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  ASSERT(is_uint8(imm8));
2238af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EnsureSpace ensure_space(this);
2239af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0x0F);
2240af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(0xC6);
2241af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  emit_sse_operand(dst, src);
2242af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  EMIT(imm8);
2243af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
2244af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2245af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
2246c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgvoid Assembler::movdqa(const Operand& dst, XMMRegister src) {
2247750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
22480c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
22490c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x66);
22500c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x0F);
22510c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x7F);
22520c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  emit_sse_operand(src, dst);
22530c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
22540c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22550c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22560c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqa(XMMRegister dst, const Operand& src) {
2257750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
22580c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
22590c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x66);
22600c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x0F);
22610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x6F);
22620c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  emit_sse_operand(dst, src);
22630c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
22640c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22650c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqu(const Operand& dst, XMMRegister src ) {
2267750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
22680c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
22690c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0xF3);
22700c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x0F);
22710c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x7F);
22720c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  emit_sse_operand(src, dst);
22730c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
22740c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22750c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22760c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Assembler::movdqu(XMMRegister dst, const Operand& src) {
2277750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
22780c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EnsureSpace ensure_space(this);
22790c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0xF3);
22800c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x0F);
22810c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  EMIT(0x6F);
22820c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  emit_sse_operand(dst, src);
22830c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
22840c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22850c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
22861af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::movntdqa(XMMRegister dst, const Operand& src) {
2287750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
22881af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EnsureSpace ensure_space(this);
22891af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x66);
22901af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x0F);
22911af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x38);
22921af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x2A);
22931af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  emit_sse_operand(dst, src);
22941af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org}
22951af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
22961af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
22971af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::movntdq(const Operand& dst, XMMRegister src) {
2298750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
22991af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EnsureSpace ensure_space(this);
23001af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x66);
23011af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x0F);
23021af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0xE7);
23031af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  emit_sse_operand(src, dst);
23041af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org}
23051af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
23061af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
23071af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.orgvoid Assembler::prefetch(const Operand& src, int level) {
23081af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  ASSERT(is_uint2(level));
23091af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EnsureSpace ensure_space(this);
23101af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x0F);
23111af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  EMIT(0x18);
2312a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Emit hint number in Reg position of RegR/M.
2313a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  XMMRegister code = XMMRegister::from_code(level);
23141af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  emit_sse_operand(code, src);
23151af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org}
23161af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
23171af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org
231843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsd(const Operand& dst, XMMRegister src ) {
2319750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
232043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
232143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);  // double
232243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
232343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x11);  // store
232443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(src, dst);
232543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
232643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
232743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
232843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::movsd(XMMRegister dst, const Operand& src) {
2329750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
233043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
233143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xF2);  // double
233243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x0F);
233343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0x10);  // load
233443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_sse_operand(dst, src);
233543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
233643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
23387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::movss(const Operand& dst, XMMRegister src ) {
2339750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
23407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EnsureSpace ensure_space(this);
23417979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0xF3);  // float
23427979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x0F);
23437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x11);  // store
23447979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  emit_sse_operand(src, dst);
23457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org}
23467979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
23477979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
23487979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgvoid Assembler::movss(XMMRegister dst, const Operand& src) {
2349750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
23507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EnsureSpace ensure_space(this);
23517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0xF3);  // float
23527979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x0F);
23537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  EMIT(0x10);  // load
23547979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  emit_sse_operand(dst, src);
23557979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org}
23567979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
23577979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org
2358ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::movd(XMMRegister dst, const Operand& src) {
2359750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2360ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
2361ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x66);
2362ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
2363ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x6E);
2364ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
2365ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2366ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2367ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
23685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::movd(const Operand& dst, XMMRegister src) {
2369750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
23705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EnsureSpace ensure_space(this);
23715f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x66);
23725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x0F);
23735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x7E);
23745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  emit_sse_operand(src, dst);
23755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
23765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
23775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
237864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
2379837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
238064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  ASSERT(is_uint8(imm8));
238164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EnsureSpace ensure_space(this);
238264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x66);
238364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x0F);
238464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x3A);
238564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(0x17);
2386b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  emit_sse_operand(src, dst);
238764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  EMIT(imm8);
238864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
238964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
239064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
2391a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::pand(XMMRegister dst, XMMRegister src) {
2392750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2393a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EnsureSpace ensure_space(this);
2394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0x66);
2395a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0x0F);
2396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(0xDB);
2397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  emit_sse_operand(dst, src);
2398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2401ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::pxor(XMMRegister dst, XMMRegister src) {
2402750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2403ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
2404ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x66);
2405ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
2406ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0xEF);
2407ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
2408ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2409ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2410ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2411c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::por(XMMRegister dst, XMMRegister src) {
2412750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2413c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EnsureSpace ensure_space(this);
2414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x66);
2415c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x0F);
2416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0xEB);
2417c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  emit_sse_operand(dst, src);
2418c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2421ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvoid Assembler::ptest(XMMRegister dst, XMMRegister src) {
2422750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
2423ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EnsureSpace ensure_space(this);
2424ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x66);
2425ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x0F);
2426ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x38);
2427ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  EMIT(0x17);
2428ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  emit_sse_operand(dst, src);
2429ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2430ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2431c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
24325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::psllq(XMMRegister reg, int8_t shift) {
2433750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2434c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EnsureSpace ensure_space(this);
2435c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x66);
2436c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x0F);
2437c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  EMIT(0x73);
2438c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  emit_sse_operand(esi, reg);  // esi == 6
24395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(shift);
24405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
24415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
24425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
2443c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psllq(XMMRegister dst, XMMRegister src) {
2444750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2445c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EnsureSpace ensure_space(this);
2446c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x66);
2447c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x0F);
2448c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0xF3);
2449c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  emit_sse_operand(dst, src);
2450c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2451c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2452c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2453c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psrlq(XMMRegister reg, int8_t shift) {
2454750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2455c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EnsureSpace ensure_space(this);
2456c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x66);
2457c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x0F);
2458c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x73);
2459c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  emit_sse_operand(edx, reg);  // edx == 2
2460c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(shift);
2461c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2462c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2463c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2464c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) {
2465750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
2466c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EnsureSpace ensure_space(this);
2467c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x66);
2468c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0x0F);
2469c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  EMIT(0xD3);
2470c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  emit_sse_operand(dst, src);
2471c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2472c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2473c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
24741f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
2475750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE2));
24765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EnsureSpace ensure_space(this);
24775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x66);
24785f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x0F);
24795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x70);
24805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  emit_sse_operand(dst, src);
24815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(shuffle);
24825f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
24835f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
24845f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
24855f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) {
2486750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
24875f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EnsureSpace ensure_space(this);
24885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x66);
24895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x0F);
24905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x3A);
24915f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(0x16);
24925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  emit_sse_operand(src, dst);
24935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  EMIT(offset);
2494d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com}
2495d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2496d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2497d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.comvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) {
2498750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(IsEnabled(SSE4_1));
2499d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EnsureSpace ensure_space(this);
2500d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EMIT(0x66);
2501d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EMIT(0x0F);
2502d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EMIT(0x3A);
2503d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EMIT(0x22);
2504d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  emit_sse_operand(dst, src);
2505d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  EMIT(offset);
2506c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
2507c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
2508c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
250943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
251043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register ireg = { reg.code() };
251143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  emit_operand(ireg, adr);
251243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
251343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) {
251643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(0xC0 | dst.code() << 3 | src.code());
251743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
251843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2520f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) {
2521f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  EMIT(0xC0 | dst.code() << 3 | src.code());
2522f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
2523f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
2524f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
2525b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) {
2526b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  EMIT(0xC0 | (dst.code() << 3) | src.code());
2527b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org}
2528b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
2529b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
253043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::Print() {
253109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Disassembler::Decode(isolate(), stdout, buffer_, pc_);
253243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
253343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
253443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
253543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::RecordJSReturn() {
2536f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  positions_recorder()->WriteRecordedPositions();
253743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EnsureSpace ensure_space(this);
2538236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  RecordRelocInfo(RelocInfo::JS_RETURN);
253943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
254043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgvoid Assembler::RecordDebugBreakSlot() {
2543f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  positions_recorder()->WriteRecordedPositions();
25442356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  EnsureSpace ensure_space(this);
25452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT);
25462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org}
25472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
25482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
254949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgvoid Assembler::RecordComment(const char* msg, bool force) {
255049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  if (FLAG_code_comments || force) {
255143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EnsureSpace ensure_space(this);
2552236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg));
255343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
255443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
255543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
255643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
255743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::GrowBuffer() {
25585c838251403b0be9a882540f1922577abba4c872ager@chromium.org  ASSERT(overflow());
255943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!own_buffer_) FATAL("external code buffer is too small");
256043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25615c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Compute new buffer size.
256243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  CodeDesc desc;  // the new buffer
256343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (buffer_size_ < 4*KB) {
256443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    desc.buffer_size = 4*KB;
256543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
256643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    desc.buffer_size = 2*buffer_size_;
256743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
256843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Some internal data structures overflow for very large buffers,
256943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // they must ensure that kMaximalBufferSize is not too large.
257043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if ((desc.buffer_size > kMaximalBufferSize) ||
25717979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org      (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) {
257243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    V8::FatalProcessOutOfMemory("Assembler::GrowBuffer");
257343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
257443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2575f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Set up new buffer.
257643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc.buffer = NewArray<byte>(desc.buffer_size);
257743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc.instr_size = pc_offset();
257843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos());
257943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
258043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Clear the buffer in debug mode. Use 'int3' instructions to make
258143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // sure to get into problems if we ever run uninitialized code.
258265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef DEBUG
258365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  memset(desc.buffer, 0xCC, desc.buffer_size);
258465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
258543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25865c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Copy the data.
258743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int pc_delta = desc.buffer - buffer_;
258843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_);
2589e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemMove(desc.buffer, buffer_, desc.instr_size);
2590e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemMove(rc_delta + reloc_info_writer.pos(),
2591e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org              reloc_info_writer.pos(), desc.reloc_size);
259243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25935c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Switch buffers.
2594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (isolate()->assembler_spare_buffer() == NULL &&
2595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      buffer_size_ == kMinimalBufferSize) {
2596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate()->set_assembler_spare_buffer(buffer_);
259743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
259843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    DeleteArray(buffer_);
259943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
260043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  buffer_ = desc.buffer;
260143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  buffer_size_ = desc.buffer_size;
260243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pc_ += pc_delta;
260343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
260443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               reloc_info_writer.last_pc() + pc_delta);
260543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26065c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Relocate runtime entries.
260743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (RelocIterator it(desc); !it.done(); it.next()) {
2608236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    RelocInfo::Mode rmode = it.rinfo()->rmode();
26096e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    if (rmode == RelocInfo::INTERNAL_REFERENCE) {
2610236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org      int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc());
2611236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org      if (*p != 0) {  // 0 means uninitialized.
2612236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org        *p += pc_delta;
2613236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org      }
261443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
261543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
261643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
261743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!overflow());
261843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
261943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
262043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
262143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
262243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint8(op1) && is_uint8(op2));  // wrong opcode
262343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint8(imm8));
262443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT((op1 & 0x01) == 0);  // should be 8bit operation
262543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(op1);
262643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(op2 | dst.code());
262743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(imm8);
262843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
262943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
263043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
263143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) {
263243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT((0 <= sel) && (sel <= 7));
263343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Register ireg = { sel };
263443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (x.is_int8()) {
263543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x83);  // using a sign-extended 8-bit immediate.
263643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit_operand(ireg, dst);
263743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(x.x_ & 0xFF);
263843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (dst.is_reg(eax)) {
263943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT((sel << 3) | 0x05);  // short form if the destination is eax.
264043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(x);
264143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
264243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    EMIT(0x81);  // using a literal 32-bit immediate.
264343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit_operand(ireg, dst);
264443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    emit(x);
264543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
264643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
264743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
264843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
264943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_operand(Register reg, const Operand& adr) {
2650ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  const unsigned length = adr.len_;
2651ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  ASSERT(length > 0);
2652ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2653ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Emit updated ModRM byte containing the given register.
2654ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3);
2655ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2656ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Emit the rest of the encoded operand.
2657ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i];
2658ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  pc_ += length;
2659ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2660ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Emit relocation information if necessary.
266159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) {
266243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    pc_ -= sizeof(int32_t);  // pc_ must be *at* disp32
266343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    RecordRelocInfo(adr.rmode_);
266443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    pc_ += sizeof(int32_t);
266543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
266643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
266743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
266843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
266943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Assembler::emit_farith(int b1, int b2, int i) {
267043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_uint8(b1) && is_uint8(b2));  // wrong opcode
267143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(0 <= i &&  i < 8);  // illegal stack offset
267243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(b1);
267343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  EMIT(b2 + i);
267443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
267543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
267643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2677a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::db(uint8_t data) {
2678a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EnsureSpace ensure_space(this);
2679a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  EMIT(data);
2680a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2681a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2682a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2683a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Assembler::dd(uint32_t data) {
2684236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  EnsureSpace ensure_space(this);
2685a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  emit(data);
2686236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}
2687236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
2688236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
2689236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
26904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  ASSERT(!RelocInfo::IsNone(rmode));
2691769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  // Don't record external references unless the heap will be serialized.
2692c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (rmode == RelocInfo::EXTERNAL_REFERENCE) {
2693c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#ifdef DEBUG
2694c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    if (!Serializer::enabled()) {
2695c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      Serializer::TooLateToEnableNow();
2696c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    }
2697c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#endif
2698badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org    if (!Serializer::enabled() && !emit_debug_code()) {
2699c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org      return;
2700c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    }
2701769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com  }
2702c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  RelocInfo rinfo(pc_, rmode, data, NULL);
270343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  reloc_info_writer.Write(&rinfo);
270443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
270543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
270765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef GENERATED_CODE_COVERAGE
270865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic FILE* coverage_log = NULL;
270965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
271065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
271165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void InitCoverageLog() {
271265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG");
271365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (file_name != NULL) {
271465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    coverage_log = fopen(file_name, "aw+");
271565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  }
271665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}
271765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
271865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
271965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgvoid LogGeneratedCodeCoverage(const char* file_line) {
272065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  const char* return_address = (&file_line)[-1];
272165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  char* push_insn = const_cast<char*>(return_address - 12);
272265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  push_insn[0] = 0xeb;  // Relative branch insn.
272365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  push_insn[1] = 13;    // Skip over coverage insns.
272465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (coverage_log != NULL) {
272565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    fprintf(coverage_log, "%s\n", file_line);
272665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    fflush(coverage_log);
272765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  }
272865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}
272965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
273065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
273165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
273243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
27339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
27349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif  // V8_TARGET_ARCH_IA32
2735