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