assembler-ia32.cc revision e0cee9b3ed82e2391fd85d118aeaa4ea361c687d
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright (c) 1994-2006 Sun Microsystems Inc. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All Rights Reserved. 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// are met: 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistributions of source code must retain the above copyright notice, 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this list of conditions and the following disclaimer. 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistribution in binary form must reproduce the above copyright 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer in the 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// documentation and/or other materials provided with the 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// distribution. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Neither the name of Sun Microsystems or the names of contributors may 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// be used to endorse or promote products derived from this software without 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// specific prior written permission. 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THE POSSIBILITY OF SUCH DAMAGE. 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The original source code covered by the above license above has been modified 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// significantly by Google Inc. 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Copyright 2010 the V8 project authors. All rights reserved. 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h" 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#if defined(V8_TARGET_ARCH_IA32) 40f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "disassembler.h" 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "macro-assembler.h" 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "serialize.h" 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of CpuFeatures 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Safe default is no features. 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint64_t CpuFeatures::supported_ = 0; 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint64_t CpuFeatures::enabled_ = 0; 54d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockuint64_t CpuFeatures::found_by_runtime_probing_ = 0; 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The Probe method needs executable memory, so it uses Heap::CreateCode. 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Allocation failure is silent and leads to safe default. 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid CpuFeatures::Probe(bool portable) { 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Heap::HasBeenSetup()); 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(supported_ == 0); 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (portable && Serializer::enabled()) { 63d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block supported_ |= OS::CpuFeaturesImpliedByPlatform(); 64d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return; // No features if we might serialize. 65d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Assembler assm(NULL, 0); 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label cpuid, done; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define __ assm. 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Save old esp, since we are going to modify the stack. 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ebp); 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ecx); 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ebx); 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(ebp, Operand(esp)); 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If we can modify bit 21 of the EFLAGS register, then CPUID is supported. 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(eax); 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(edx, Operand(eax)); 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, 0x200000); // Flip bit 21. 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(eax); 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ popfd(); 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(eax); 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, Operand(edx)); // Different if CPUID is supported. 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ j(not_zero, &cpuid); 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CPUID not supported. Clear the supported features in edx:eax. 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, Operand(eax)); 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(edx, Operand(edx)); 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ jmp(&done); 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Invoke CPUID with 1 in eax to get feature information in 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ecx:edx. Temporarily enable CPUID support because we know it's 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // safe here. 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ bind(&cpuid); 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(eax, 1); 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = (1 << CPUID); 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block { Scope fscope(CPUID); 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ cpuid(); 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = 0; 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Move the result from ecx:edx to edx:eax and make sure to mark the 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CPUID feature as supported. 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(eax, Operand(edx)); 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ or_(eax, 1 << CPUID); 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(edx, Operand(ecx)); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Done. 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ bind(&done); 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(esp, Operand(ebp)); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ebx); 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ecx); 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ popfd(); 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ebp); 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ ret(0); 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef __ 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CodeDesc desc; 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assm.GetCode(&desc); 1235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 1245913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Object* code; 1255913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck { MaybeObject* maybe_code = Heap::CreateCode(desc, 1265913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Code::ComputeFlags(Code::STUB), 1275913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Handle<Code>::null()); 1285913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck if (!maybe_code->ToObject(&code)) return; 1295913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck } 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!code->IsCode()) return; 1315913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block PROFILE(CodeCreateEvent(Logger::BUILTIN_TAG, 1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code::cast(code), "CpuFeatures::Probe")); 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef uint64_t (*F0)(); 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry()); 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = probe(); 137d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block found_by_runtime_probing_ = supported_; 138d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform(); 139d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block supported_ |= os_guarantees; 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch found_by_runtime_probing_ &= portable ? ~os_guarantees : 0; 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Displacement 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Displacement::init(Label* L, Type type) { 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!L->is_bound()); 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int next = 0; 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_linked()) { 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block next = L->pos(); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(next > 0); // Displacements must be at positions > 0 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure that we _never_ overflow the next field. 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(NextField::is_valid(Assembler::kMaximalBufferSize)); 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block data_ = NextField::encode(next) | TypeField::encode(type); 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of RelocInfo 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int RelocInfo::kApplyMask = 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 166bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE | 167bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1 << RelocInfo::DEBUG_BREAK_SLOT; 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 170f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkebool RelocInfo::IsCodedSpecially() { 171f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // The deserializer needs to know whether a pointer is specially coded. Being 172f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // specially coded on IA32 means that it is a relative address, as used by 173f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // branch instructions. These are also the ones that need changing when a 174f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // code object moves. 175f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke return (1 << rmode_) & kApplyMask; 176f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 177f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 178f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Patch the code at the current address with the supplied instructions. 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < instruction_count; i++) { 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *(pc_ + i) = *(instructions + i); 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Indicate that code has changed. 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CPU::FlushICache(pc_, instruction_count); 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Patch the code at the current PC with a call to the target address. 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Additional guard int3 instructions can be added if required. 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Call instruction takes up 5 bytes and int3 takes up one byte. 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kCallCodeSize = 5; 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int code_size = kCallCodeSize + guard_bytes; 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a code patcher. 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CodePatcher patcher(pc_, code_size); 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add a label for checking the size of the code used for returning. 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label check_codesize; 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->bind(&check_codesize); 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Patch the code. 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->call(target, RelocInfo::NONE); 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the size of the code generated is as expected. 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(kCallCodeSize, 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add the requested number of int3 instructions after the call. 2147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT_GE(guard_bytes, 0); 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < guard_bytes; i++) { 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->int3(); 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Operand 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) { 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp/r] 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) { 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base] 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, base); 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (is_int8(disp) && rmode == RelocInfo::NONE) { 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp8] 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(1, base); 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_disp8(disp); 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp/r] 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(2, base); 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register index, 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScaleFactor scale, 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t disp, 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode) { 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!index.is(esp)); // illegal addressing mode 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp/r] 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) { 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale] 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, esp); 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (is_int8(disp) && rmode == RelocInfo::NONE) { 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp8] 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(1, esp); 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_disp8(disp); 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp/r] 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(2, esp); 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register index, 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScaleFactor scale, 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t disp, 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode) { 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!index.is(esp)); // illegal addressing mode 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [index*scale + disp/r] 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, esp); 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, ebp); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Operand::is_reg(Register reg) const { 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && ((buf_[0] & 0x07) == reg.code()); // register codes match. 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 2873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Implementation of Assembler. 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Emit a single byte. Must always be inlined. 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define EMIT(x) \ 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *pc_++ = (x) 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog(); 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Spare buffer. 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Assembler::spare_buffer_ = NULL; 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3013e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuAssembler::Assembler(void* buffer, int buffer_size) 3023e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu : positions_recorder_(this) { 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer == NULL) { 3043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Do our own buffer management. 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer_size <= kMinimalBufferSize) { 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size = kMinimalBufferSize; 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_buffer_ != NULL) { 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer = spare_buffer_; 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_buffer_ = NULL; 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer == NULL) { 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = NewArray<byte>(buffer_size); 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = static_cast<byte*>(buffer); 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = buffer_size; 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block own_buffer_ = true; 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 3213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Use externally provided buffer instead. 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(buffer_size > 0); 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = static_cast<byte*>(buffer); 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = buffer_size; 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block own_buffer_ = false; 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clear the buffer in debug mode unless it was provided by the 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // caller in which case we can't be sure it's okay to overwrite 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // existing code in it; see CodePatcher::CodePatcher(...). 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (own_buffer_) { 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(buffer_, 0xCC, buffer_size); // int3 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup buffer pointers. 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(buffer_ != NULL); 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ = buffer_; 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InitCoverageLog(); 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAssembler::~Assembler() { 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (own_buffer_) { 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_buffer_ = buffer_; 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(buffer_); 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GetCode(CodeDesc* desc) { 3613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Finalize code (at this point overflow() may be true, but the gap ensures 3623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // that we are still not overlapping instructions and relocation info). 3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ASSERT(pc_ <= reloc_info_writer.pos()); // No overlap. 3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup code descriptor. 365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->buffer = buffer_; 366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->buffer_size = buffer_size_; 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->instr_size = pc_offset(); 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->origin = this; 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Counters::reloc_info_size.Increment(desc->reloc_size); 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Align(int m) { 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsPowerOf2(m)); 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while ((pc_offset() & (m - 1)) != 0) { 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block nop(); 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3839dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenvoid Assembler::CodeTargetAlign() { 3849dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen Align(16); // Preferred alignment of jump targets on ia32. 3859dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen} 3869dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 3879dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cpuid() { 389d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(CPUID)); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA2); 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushad() { 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x60); 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popad() { 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x61); 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushfd() { 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9C); 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popfd() { 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9D); 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Immediate& x) { 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (x.is_int8()) { 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x6a); 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(x.x_); 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x68); 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::push_imm32(int32_t imm32) { 439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x68); 441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit(imm32); 442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(Register src) { 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x50 | src.code()); 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Operand& src) { 453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esi, src); 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(Register dst) { 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reloc_info_writer.last_pc() != NULL); 462f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_peephole_optimization && (reloc_info_writer.last_pc() <= last_pc_)) { 4633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // (last_pc_ != NULL) is rolled into the above check. 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If a last_pc_ is set, we need to make sure that there has not been any 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // relocation information generated between the last instruction and this 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // pop instruction. 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte instr = last_pc_[0]; 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((instr & ~0x7) == 0x50) { 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int push_reg_code = instr & 0x7; 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (push_reg_code == dst.code()) { 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ = last_pc_; 472f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (same reg) eliminated\n", pc_offset()); 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert 'push src; pop dst' to 'mov dst, src'. 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0x8b; 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register src = { push_reg_code }; 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, Operand(src)); 481f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (reg->reg) eliminated\n", pc_offset()); 483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (instr == 0xff) { // push of an operand, convert to a move 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte op1 = last_pc_[1]; 4893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check if the operation is really a push. 490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((op1 & 0x38) == (6 << 3)) { 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block op1 = (op1 & ~0x38) | static_cast<byte>(dst.code() << 3); 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0x8b; 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[1] = op1; 494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 495f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (op->reg) eliminated\n", pc_offset()); 497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if ((instr == 0x89) && 501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (last_pc_[1] == 0x04) && 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (last_pc_[2] == 0x24)) { 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0x71283c 396 890424 mov [esp],eax 504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0x71283f 399 58 pop eax 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (dst.is(eax)) { 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // change to 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0x710fac 216 83c404 add esp,0x4 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0x83; 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[1] = 0xc4; 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[2] = 0x04; 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 512f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (mov-pop) eliminated\n", pc_offset()); 514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (instr == 0x6a && dst.is(eax)) { // push of immediate 8 bit 518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte imm8 = last_pc_[1]; 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 0) { 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 6a00 push 0x0 521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 58 pop eax 522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0x31; 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[1] = 0xc0; 524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // change to 525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 31c0 xor eax,eax 526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 527f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (imm->reg) eliminated\n", pc_offset()); 529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 6a00 push 0xXX 533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 58 pop eax 534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0xb8; 535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((imm8 & 0x80) != 0) { 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xff); 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xff); 539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xff); 540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // change to 541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // b8XXffffff mov eax,0xffffffXX 542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x00); 544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x00); 545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x00); 546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // change to 547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // b8XX000000 mov eax,0x000000XX 548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 550f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (imm->reg) eliminated\n", pc_offset()); 552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (instr == 0x68 && dst.is(eax)) { // push of immediate 32 bit 556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 68XXXXXXXX push 0xXXXXXXXX 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 58 pop eax 558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_[0] = 0xb8; 559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // change to 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // b8XXXXXXXX mov eax,0xXXXXXXXX 562f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop (imm->reg) eliminated\n", pc_offset()); 564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Other potential patterns for peephole: 569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0x712716 102 890424 mov [esp], eax 570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0x712719 105 8b1424 mov edx, [esp] 571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x58 | dst.code()); 575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(const Operand& dst) { 579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8F); 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::enter(const Immediate& size) { 587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC8); 590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_w(size); 591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0); 592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::leave() { 596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC9); 599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(Register dst, const Operand& src) { 603e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(dst.code() < 4); 604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8A); 607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, int8_t imm8) { 612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC6); 615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, Register src) { 621e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(src.code() < 4); 622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x88); 625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(Register dst, const Operand& src) { 630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8B); 634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(const Operand& dst, Register src) { 639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, int32_t imm32) { 648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm32); 652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Immediate& x) { 656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Handle<Object> handle) { 664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(handle); 668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Operand& src) { 672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8B); 675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Register src) { 680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | src.code() << 3 | dst.code()); 684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, const Immediate& x) { 688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC7); 691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Handle<Object> handle) { 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC7); 700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(handle); 702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Register src) { 706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_b(Register dst, const Operand& src) { 714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xBE); 718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_w(Register dst, const Operand& src) { 723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xBF); 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_b(Register dst, const Operand& src) { 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB6); 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_w(Register dst, const Operand& src) { 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB7); 745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, int32_t imm32) { 750d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(CMOV)); 751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNIMPLEMENTED(); 754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(cc); 755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(dst); 756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(imm32); 757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, Handle<Object> handle) { 761d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(CMOV)); 762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNIMPLEMENTED(); 765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(cc); 766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(dst); 767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(handle); 768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) { 772d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(CMOV)); 773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Opcode: 0f 40 + cc /r. 776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x40 + cc); 778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7826ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cld() { 7836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 7846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 7856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xFC); 7866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 7876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 789e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::rep_movs() { 790e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 791e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 792e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 793e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xA5); 794e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 795e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 796e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 7976ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::rep_stos() { 7986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 7996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 8006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF3); 8016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xAB); 8026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 8036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 8046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 805f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkevoid Assembler::stos() { 806f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke EnsureSpace ensure_space(this); 807f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke last_pc_ = pc_; 808f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke EMIT(0xAB); 809f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 810f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 811f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xchg(Register dst, Register src) { 813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (src.is(eax) || dst.is(eax)) { // Single-byte encoding. 816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90 | (src.is(eax) ? dst.code() : src.code())); 817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x87); 819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | src.code() << 3 | dst.code()); 820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, int32_t imm32) { 825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(2, Operand(dst), Immediate(imm32)); 828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, const Operand& src) { 832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x13); 835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(Register dst, const Operand& src) { 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x03); 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(const Operand& dst, const Immediate& x) { 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reloc_info_writer.last_pc() != NULL); 849f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_peephole_optimization && (reloc_info_writer.last_pc() <= last_pc_)) { 850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte instr = last_pc_[0]; 851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((instr & 0xf8) == 0x50) { 852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Last instruction was a push. Check whether this is a pop without a 853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // result. 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((dst.is_reg(esp)) && 855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (x.x_ == kPointerSize) && (x.rmode_ == RelocInfo::NONE)) { 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ = last_pc_; 857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 858f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (FLAG_print_peephole_optimization) { 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("%d push/pop(noreg) eliminated\n", pc_offset()); 860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(0, dst, x); 868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, int32_t imm32) { 87259151504615d929945dc59db37bf1166937748c6Steve Block and_(dst, Immediate(imm32)); 87359151504615d929945dc59db37bf1166937748c6Steve Block} 87459151504615d929945dc59db37bf1166937748c6Steve Block 87559151504615d929945dc59db37bf1166937748c6Steve Block 87659151504615d929945dc59db37bf1166937748c6Steve Blockvoid Assembler::and_(Register dst, const Immediate& x) { 877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 87959151504615d929945dc59db37bf1166937748c6Steve Block emit_arith(4, Operand(dst), x); 880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, const Operand& src) { 884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x23); 887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, const Immediate& x) { 892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(4, dst, x); 895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, Register src) { 899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x21); 902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb(const Operand& op, int8_t imm8) { 907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80); 910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, op); // edi == 7 911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 915d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarkevoid Assembler::cmpb(const Operand& dst, Register src) { 916d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke ASSERT(src.is_byte_register()); 917d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EnsureSpace ensure_space(this); 918d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke last_pc_ = pc_; 919d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EMIT(0x38); 920d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke emit_operand(src, dst); 921d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke} 922d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 923d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 924d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarkevoid Assembler::cmpb(Register dst, const Operand& src) { 925d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke ASSERT(dst.is_byte_register()); 926d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EnsureSpace ensure_space(this); 927d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke last_pc_ = pc_; 928d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EMIT(0x3A); 929d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke emit_operand(dst, src); 930d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke} 931d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 932d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw(const Operand& op, Immediate imm16) { 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(imm16.is_int16()); 935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x81); 939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, op); 940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_w(imm16); 941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, int32_t imm32) { 945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, Operand(reg), Immediate(imm32)); 948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, Handle<Object> handle) { 952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, Operand(reg), Immediate(handle)); 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, const Operand& op) { 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x3B); 962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(reg, op); 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, const Immediate& imm) { 967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, op, imm); 970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, Handle<Object> handle) { 974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, op, Immediate(handle)); 977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb_al(const Operand& op) { 981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x38); // CMP r/m8, r8 984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); // eax has same code as register al. 985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw_ax(const Operand& op) { 989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x39); // CMP r/m16, r16 993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); // eax has same code as register ax. 994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec_b(Register dst) { 998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFE); 1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC8 | dst.code()); 1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10050d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::dec_b(const Operand& dst) { 10060d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 10070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 10080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xFE); 10090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_operand(ecx, dst); 10100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 10110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 10120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(Register dst) { 1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x48 | dst.code()); 1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(const Operand& dst) { 1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ecx, dst); 1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cdq() { 1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x99); 1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::idiv(Register src) { 1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | src.code()); 1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register reg) { 1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8 | reg.code()); 1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, const Operand& src) { 1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAF); 1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, Register src, int32_t imm32) { 1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(imm32)) { 1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x6B); 1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm32); 1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x69); 1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm32); 1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(Register dst) { 1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x40 | dst.code()); 1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(const Operand& dst) { 1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::lea(Register dst, const Operand& src) { 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8D); 1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mul(Register src) { 1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | src.code()); 1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::neg(Register dst) { 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD8 | dst.code()); 1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::not_(Register dst) { 1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, int32_t imm32) { 1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(1, Operand(dst), Immediate(imm32)); 1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, const Operand& src) { 1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0B); 1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, const Immediate& x) { 1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(1, dst, x); 1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, Register src) { 1145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x09); 1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rcl(Register dst, uint8_t imm8) { 1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1167756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Assembler::rcr(Register dst, uint8_t imm8) { 1168756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EnsureSpace ensure_space(this); 1169756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick last_pc_ = pc_; 1170756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(is_uint5(imm8)); // illegal shift count 1171756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (imm8 == 1) { 1172756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD1); 1173756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD8 | dst.code()); 1174756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } else { 1175756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xC1); 1176756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD8 | dst.code()); 1177756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(imm8); 1178756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 1179756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1180756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1181756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sar(Register dst, uint8_t imm8) { 1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1197d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid Assembler::sar_cl(Register dst) { 1198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD3); 1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sbb(Register dst, const Operand& src) { 1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x1B); 1209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shld(Register dst, const Operand& src) { 1214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA5); 1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shl(Register dst, uint8_t imm8) { 1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1237d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid Assembler::shl_cl(Register dst) { 1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD3); 1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shrd(Register dst, const Operand& src) { 1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAD); 1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shr(Register dst, uint8_t imm8) { 1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1258d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (imm8 == 1) { 1259d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xD1); 1260d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xE8 | dst.code()); 1261d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } else { 1262d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xC1); 1263d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xE8 | dst.code()); 1264d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(imm8); 1265d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shr_cl(Register dst) { 1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1272d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xD3); 1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8 | dst.code()); 1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::subb(const Operand& op, int8_t imm8) { 12783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 12793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block last_pc_ = pc_; 12803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (op.is_reg(eax)) { 12813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0x2c); 12823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } else { 12833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0x80); 12843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block emit_operand(ebp, op); // ebp == 5 12853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 12863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(imm8); 12873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 12883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 12893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, const Immediate& x) { 1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(5, dst, x); 1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(Register dst, const Operand& src) { 1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2B); 1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1305e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::subb(Register dst, const Operand& src) { 1306e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(dst.code() < 4); 1307e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1308e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 1309e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x2A); 1310e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(dst, src); 1311e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1312e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1313e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, Register src) { 1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x29); 1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Immediate& imm) { 1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only use test against byte for registers that have a byte 1326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // variant: eax, ebx, ecx, and edx. 1327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm.rmode_ == RelocInfo::NONE && is_uint8(imm.x_) && reg.code() < 4) { 1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t imm8 = imm.x_; 1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (reg.is(eax)) { 1330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA8); 1331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith_b(0xF6, 0xC0, reg, imm8); 1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // This is not using emit_arith because test doesn't support 1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sign-extension of 8-bit operands. 1338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (reg.is(eax)) { 1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA9); 1340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | reg.code()); 1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm); 1345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Operand& op) { 1350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x85); 1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(reg, op); 1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1357e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::test_b(Register reg, const Operand& op) { 1358e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1359e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 1360e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x84); 1361e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(reg, op); 1362e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1363e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1364e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(const Operand& op, const Immediate& imm) { 1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); 1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm); 1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::test_b(const Operand& op, uint8_t imm8) { 13757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 13767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch last_pc_ = pc_; 13777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0xF6); 13787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_operand(eax, op); 13797f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(imm8); 13807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 13817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 13827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, int32_t imm32) { 1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(6, Operand(dst), Immediate(imm32)); 1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, const Operand& src) { 1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x33); 1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& src, Register dst) { 1399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x31); 1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& dst, const Immediate& x) { 1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(6, dst, x); 1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bt(const Operand& dst, Register src) { 1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA3); 1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bts(const Operand& dst, Register src) { 1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAB); 1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::hlt() { 1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF4); 1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::int3() { 1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xCC); 1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::nop() { 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90); 1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rdtsc() { 1453d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(RDTSC)); 1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x31); 1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ret(int imm16) { 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint16(imm16)); 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm16 == 0) { 1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC3); 1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC2); 1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm16 & 0xFF); 1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((imm16 >> 8) & 0xFF); 1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Labels refer to positions in the (to be) generated code. 1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There are bound, linked, and unused labels. 1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Bound labels refer to known positions in the already 1479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// generated code. pos() is the position the label refers to. 1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Linked labels refer to unknown positions in the code 1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be generated; pos() is the position of the 32bit 1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Displacement of the last instruction using the label. 1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::print(Label* L) { 1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_unused()) { 1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("unused label\n"); 1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (L->is_bound()) { 1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("bound label to %d\n", L->pos()); 1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (L->is_linked()) { 1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label l = *L; 1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("unbound label"); 1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while (l.is_linked()) { 1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Displacement disp = disp_at(&l); 1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("@ %d ", l.pos()); 1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.print(); 1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("\n"); 1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.next(&l); 1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind_to(Label* L, int pos) { 1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= pos && pos <= pc_offset()); // must have a valid binding position 1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while (L->is_linked()) { 1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Displacement disp = disp_at(L); 1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int fixup_pos = L->pos(); 1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp.type() == Displacement::CODE_RELATIVE) { 1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Relative to Code* heap object pointer. 1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); 1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 15213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Relative address, relative to point after address. 1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block long_at_put(fixup_pos, imm32); 1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.next(L); 1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block L->bind_to(pos); 1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind(Label* L) { 1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = NULL; 1534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!L->is_bound()); // label can only be bound once 1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bind_to(L, pc_offset()); 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 15390d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::bind(NearLabel* L) { 15400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(!L->is_bound()); 15410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = NULL; 15420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen while (L->unresolved_branches_ > 0) { 15430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen int branch_pos = L->unresolved_positions_[L->unresolved_branches_ - 1]; 15440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen int disp = pc_offset() - branch_pos; 15450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(is_int8(disp)); 15460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_byte_at(branch_pos - sizeof(int8_t), disp); 15470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen L->unresolved_branches_--; 15480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 15490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen L->bind_to(pc_offset()); 15500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 15510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Label* L) { 1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 5; 1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1000 #32-bit disp. 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1000 #32-bit disp. 1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::OTHER); 1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) { 1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!RelocInfo::IsCodeTarget(rmode)); 1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(const Operand& adr) { 1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edx, adr); 1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Handle<Code> code, RelocInfo::Mode rmode) { 15923e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(RelocInfo::IsCodeTarget(rmode)); 1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(reinterpret_cast<intptr_t>(code.location()), rmode); 1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Label* L) { 1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int short_size = 2; 1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 5; 1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(offs - short_size)) { 16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1011 #8-bit disp. 1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xEB); 1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((offs - short_size) & 0xFF); 1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 16143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1001 #32-bit disp. 1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1001 #32-bit disp. 1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!RelocInfo::IsCodeTarget(rmode)); 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(const Operand& adr) { 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esp, adr); 1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) { 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(RelocInfo::IsCodeTarget(rmode)); 1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(reinterpret_cast<intptr_t>(code.location()), rmode); 1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16520d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::jmp(NearLabel* L) { 16530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 16540d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 16550d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (L->is_bound()) { 16560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen const int short_size = 2; 16570d5e116f6aee03185f237311a943491bb079a768Kristian Monsen int offs = L->pos() - pc_offset(); 16580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(offs <= 0); 16590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(is_int8(offs - short_size)); 16600d5e116f6aee03185f237311a943491bb079a768Kristian Monsen // 1110 1011 #8-bit disp. 16610d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xEB); 16620d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT((offs - short_size) & 0xFF); 16630d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 16640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xEB); 16650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x00); // The displacement will be resolved later. 16660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen L->link_to(pc_offset()); 16670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 16680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 16690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::j(Condition cc, Label* L, Hint hint) { 1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= cc && cc < 16); 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int short_size = 2; 1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 6; 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(offs - short_size)) { 1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0111 tttn #8-bit disp 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x70 | cc); 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((offs - short_size) & 0xFF); 1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note: could eliminate cond. jumps to this jump if condition 1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // is the same however, seems to be rather unlikely case. 1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::OTHER); 1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode, Hint hint) { 1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((0 <= cc) && (cc < 16)); 1706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 0000 1111 1000 tttn #32-bit disp. 1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::j(Condition cc, Handle<Code> code, Hint hint) { 1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(reinterpret_cast<intptr_t>(code.location()), RelocInfo::CODE_TARGET); 1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17250d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::j(Condition cc, NearLabel* L, Hint hint) { 17260d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 17270d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 17280d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(0 <= cc && cc < 16); 17290d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 17300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (L->is_bound()) { 17310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen const int short_size = 2; 17320d5e116f6aee03185f237311a943491bb079a768Kristian Monsen int offs = L->pos() - pc_offset(); 17330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(offs <= 0); 17340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(is_int8(offs - short_size)); 17350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen // 0111 tttn #8-bit disp 17360d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x70 | cc); 17370d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT((offs - short_size) & 0xFF); 17380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 17390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x70 | cc); 17400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x00); // The displacement will be resolved later. 17410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen L->link_to(pc_offset()); 17420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 17430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 17440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 17450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// FPU instructions. 1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld(int i) { 1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xD9, 0xC0, i); 1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1755402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fstp(int i) { 1756402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1757402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu last_pc_ = pc_; 1758402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu emit_farith(0xDD, 0xD8, i); 1759402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1760402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1761402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld1() { 1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1770402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fldpi() { 1771402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1772402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu last_pc_ = pc_; 1773402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xD9); 1774402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xEB); 1775402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1776402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1777402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fldz() { 1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xEE); 1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fldln2() { 1787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 1789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xD9); 1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xED); 1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_s(const Operand& adr) { 1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_d(const Operand& adr) { 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDD); 1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_s(const Operand& adr) { 1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_d(const Operand& adr) { 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDD); 1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1826402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fst_d(const Operand& adr) { 1827402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1828402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu last_pc_ = pc_; 1829402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xDD); 1830402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu emit_operand(edx, adr); 1831402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1832402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1833402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_s(const Operand& adr) { 1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_d(const Operand& adr) { 1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebp, adr); 1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_s(const Operand& adr) { 1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisttp_s(const Operand& adr) { 1859d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE3)); 1860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ecx, adr); 1864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1867e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::fisttp_d(const Operand& adr) { 1868e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE3)); 1869e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1870e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 1871e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xDD); 1872e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(ecx, adr); 1873e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1874e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1875e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fist_s(const Operand& adr) { 1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edx, adr); 1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_d(const Operand& adr) { 1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, adr); 1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fabs() { 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE1); 1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fchs() { 1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0); 1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcos() { 1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsin() { 1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFE); 1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fyl2x() { 1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 1926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xD9); 1928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xF1); 1929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fadd(int i) { 1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xC0, i); 1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsub(int i) { 1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xE8, i); 1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisub_s(const Operand& adr) { 1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDA); 1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esp, adr); 1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmul(int i) { 1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xC8, i); 1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdiv(int i) { 1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xF8, i); 1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::faddp(int i) { 1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xC0, i); 1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubp(int i) { 1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xE8, i); 1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubrp(int i) { 1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xE0, i); 1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmulp(int i) { 1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xC8, i); 1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdivp(int i) { 1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xF8, i); 2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem() { 2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8); 2008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem1() { 2012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF5); 2016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fxch(int i) { 2020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xD9, 0xC8, i); 2023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fincstp() { 2027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 2031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ffree(int i) { 2035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDD, 0xC0, i); 2038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ftst() { 2042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE4); 2046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucomp(int i) { 2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDD, 0xE8, i); 2053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucompp() { 2057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDA); 2060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 2061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomi(int i) { 20653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 20663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block last_pc_ = pc_; 20673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xDB); 20683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xE8 + i); 20693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomip() { 20733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 20743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block last_pc_ = pc_; 20753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xDF); 20763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xE9); 20773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 2080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcompp() { 2081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDE); 2084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnstsw_ax() { 2089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0); 2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fwait() { 2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9B); 2100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::frndint() { 2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFC); 2108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnclex() { 2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 2115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE2); 2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sahf() { 2120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9E); 2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::setcc(Condition cc, Register reg) { 2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reg.is_byte_register()); 2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90 | cc); 2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | reg.code()); 2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttss2si(Register dst, const Operand& src) { 2137d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF3); 2141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2C); 2143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 2144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttsd2si(Register dst, const Operand& src) { 2148d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2C); 2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) { 2159d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2A); 2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 21696ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { 21706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 21716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 21726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 21736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF3); 21746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 21756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x5A); 21766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 21776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 21786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::addsd(XMMRegister dst, XMMRegister src) { 2181d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x58); 2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) { 2192d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x59); 2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::subsd(XMMRegister dst, XMMRegister src) { 2203d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x5C); 2209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::divsd(XMMRegister dst, XMMRegister src) { 2214d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 2218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x5E); 2220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2224e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::xorpd(XMMRegister dst, XMMRegister src) { 2225e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE2)); 2226e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2227e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 2228e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 2229e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2230e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x57); 2231e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 2232e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2233e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2234e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 22356ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { 22366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 22376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 22386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF2); 22396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 22406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x51); 22416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 22426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22450d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::andpd(XMMRegister dst, XMMRegister src) { 22460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 22470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 22480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x66); 22490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 22500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x54); 22510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 22520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22540d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22556ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ucomisd(XMMRegister dst, XMMRegister src) { 22566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 22576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 22586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 22596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 22606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 22616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x2E); 22626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 22636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22666ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movmskpd(Register dst, XMMRegister src) { 22676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 22686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 22696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 22706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 22716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 22726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x50); 22736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 22746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22770d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { 22780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(CpuFeatures::IsEnabled(SSE2)); 22790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 22800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 22810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xF2); 22820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 22830d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xC2); 22840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 22850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(1); // LT == 1 22860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22880d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22890d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movaps(XMMRegister dst, XMMRegister src) { 22900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(CpuFeatures::IsEnabled(SSE2)); 22910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 22920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 22930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 22940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x28); 22950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 22960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22990d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movdqa(const Operand& dst, XMMRegister src) { 2300e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE2)); 2301e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2302e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 2303e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 2304e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2305e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x7F); 2306e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(src, dst); 2307e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2308e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2309e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2310e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqa(XMMRegister dst, const Operand& src) { 2311e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE2)); 2312e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2313e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 2314e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 2315e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2316e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x6F); 2317e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 2318e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2319e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2320e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2321e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(const Operand& dst, XMMRegister src ) { 2322e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE2)); 2323e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2324e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 2325e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 2326e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2327e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x7F); 2328e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(src, dst); 2329e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2330e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2331e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2332e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(XMMRegister dst, const Operand& src) { 2333e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(CpuFeatures::IsEnabled(SSE2)); 2334e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2335e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke last_pc_ = pc_; 2336e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 2337e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2338e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x6F); 2339e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 2340e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2341e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2342e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 23437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::movntdqa(XMMRegister dst, const Operand& src) { 23447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 23457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 23467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch last_pc_ = pc_; 23477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x66); 23487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 23497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x38); 23507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x2A); 23517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(dst, src); 23527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 23537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23547f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::movntdq(const Operand& dst, XMMRegister src) { 23567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 23577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 23587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch last_pc_ = pc_; 23597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x66); 23607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 23617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0xE7); 23627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(src, dst); 23637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 23647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::prefetch(const Operand& src, int level) { 23677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(is_uint2(level)); 23687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 23697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch last_pc_ = pc_; 23707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 23717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x18); 23727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch XMMRegister code = { level }; // Emit hint number in Reg position of RegR/M. 23737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(code, src); 23747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 23757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movdbl(XMMRegister dst, const Operand& src) { 2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block movsd(dst, src); 2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movdbl(const Operand& dst, XMMRegister src) { 2385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block movsd(dst, src); 2388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(const Operand& dst, XMMRegister src ) { 2392d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); // double 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x11); // store 2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(src, dst); 2399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(XMMRegister dst, const Operand& src) { 2403d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 2404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ = pc_; 2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); // double 2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x10); // load 2409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24136ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movsd(XMMRegister dst, XMMRegister src) { 24146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 24156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 24166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 24176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF2); 24186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 24196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x10); 24206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 24216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24246ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movd(XMMRegister dst, const Operand& src) { 24256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 24266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 24276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 24286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 24296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 24306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x6E); 24316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 24326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::movd(const Operand& dst, XMMRegister src) { 2436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 2439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x7E); 2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(src, dst); 2443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pand(XMMRegister dst, XMMRegister src) { 2447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 2450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xDB); 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(dst, src); 2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24576ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::pxor(XMMRegister dst, XMMRegister src) { 24586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(CpuFeatures::IsEnabled(SSE2)); 24596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 24606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 24616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 24626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 24636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xEF); 24646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 24656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::por(XMMRegister dst, XMMRegister src) { 2469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_pc_ = pc_; 2472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xEB); 2475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 24796ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ptest(XMMRegister dst, XMMRegister src) { 2480f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 24816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 24826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block last_pc_ = pc_; 24836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 24846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 24856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x38); 24866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x17); 24876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 24886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 2491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::psllq(XMMRegister reg, int8_t shift) { 24920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(CpuFeatures::IsEnabled(SSE2)); 24930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 24940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen last_pc_ = pc_; 24950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x66); 24960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 24970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x73); 24980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(esi, reg); // esi == 6 2499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(shift); 2500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psllq(XMMRegister dst, XMMRegister src) { 2504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_pc_ = pc_; 2507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xF3); 2510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister reg, int8_t shift) { 2515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_pc_ = pc_; 2518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x73); 2521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(edx, reg); // edx == 2 2522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(shift); 2523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) { 2527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_pc_ = pc_; 2530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xD3); 2533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle) { 2538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 2541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x70); 2544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(dst, src); 2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(shuffle); 2546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) { 2550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch last_pc_ = pc_; 2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x3A); 2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x16); 2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(src, dst); 2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(offset); 25591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 25601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) { 25631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 25641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EnsureSpace ensure_space(this); 25651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block last_pc_ = pc_; 25661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x66); 25671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x0F); 25681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x3A); 25691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x22); 25701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block emit_sse_operand(dst, src); 25711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(offset); 25720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 25730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 25740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 2575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 2576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register ireg = { reg.code() }; 2577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, adr); 2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { 2582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 2583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 25866ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) { 25876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 25886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 25896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 25906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Print() { 2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Disassembler::Decode(stdout, buffer_, pc_); 2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordJSReturn() { 25973e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(RelocInfo::JS_RETURN); 2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::RecordDebugBreakSlot() { 26043e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 26057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 26067f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 26077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 26087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Assembler::RecordComment(const char* msg, bool force) { 2611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (FLAG_code_comments || force) { 2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 2614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GrowBuffer() { 26193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ASSERT(overflow()); 2620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!own_buffer_) FATAL("external code buffer is too small"); 2621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Compute new buffer size. 2623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CodeDesc desc; // the new buffer 2624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer_size_ < 4*KB) { 2625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer_size = 4*KB; 2626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer_size = 2*buffer_size_; 2628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Some internal data structures overflow for very large buffers, 2630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // they must ensure that kMaximalBufferSize is not too large. 2631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((desc.buffer_size > kMaximalBufferSize) || 26323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block (desc.buffer_size > Heap::MaxOldGenerationSize())) { 2633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 2634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup new buffer. 2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer = NewArray<byte>(desc.buffer_size); 2638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.instr_size = pc_offset(); 2639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos()); 2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clear the buffer in debug mode. Use 'int3' instructions to make 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sure to get into problems if we ever run uninitialized code. 2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(desc.buffer, 0xCC, desc.buffer_size); 2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Copy the data. 2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int pc_delta = desc.buffer - buffer_; 2649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memmove(desc.buffer, buffer_, desc.instr_size); 2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memmove(rc_delta + reloc_info_writer.pos(), 2652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.pos(), desc.reloc_size); 2653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Switch buffers. 2655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { 2656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block spare_buffer_ = buffer_; 2657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(buffer_); 2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = desc.buffer; 2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = desc.buffer_size; 2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += pc_delta; 2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (last_pc_ != NULL) { 2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block last_pc_ += pc_delta; 2665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 2667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.last_pc() + pc_delta); 2668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Relocate runtime entries. 2670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (RelocIterator it(desc); !it.done(); it.next()) { 2671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode = it.rinfo()->rmode(); 2672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (rmode == RelocInfo::RUNTIME_ENTRY) { 2673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *p -= pc_delta; // relocate entry 2675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (rmode == RelocInfo::INTERNAL_REFERENCE) { 2676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 2677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (*p != 0) { // 0 means uninitialized. 2678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *p += pc_delta; 2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!overflow()); 2684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { 2688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(op1) && is_uint8(op2)); // wrong opcode 2689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(imm8)); 2690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((op1 & 0x01) == 0); // should be 8bit operation 2691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(op1); 2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(op2 | dst.code()); 2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 2694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { 2698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((0 <= sel) && (sel <= 7)); 2699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register ireg = { sel }; 2700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (x.is_int8()) { 2701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x83); // using a sign-extended 8-bit immediate. 2702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, dst); 2703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(x.x_ & 0xFF); 2704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (dst.is_reg(eax)) { 2705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((sel << 3) | 0x05); // short form if the destination is eax. 2706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 2707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x81); // using a literal 32-bit immediate. 2709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, dst); 2710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 2711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_operand(Register reg, const Operand& adr) { 2716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const unsigned length = adr.len_; 2717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(length > 0); 2718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit updated ModRM byte containing the given register. 2720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); 2721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit the rest of the encoded operand. 2723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 2724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += length; 2725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit relocation information if necessary. 2727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (length >= sizeof(int32_t) && adr.rmode_ != RelocInfo::NONE) { 2728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 2729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(adr.rmode_); 2730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += sizeof(int32_t); 2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_farith(int b1, int b2, int i) { 2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= i && i < 8); // illegal stack offset 2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(b1); 2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(b2 + i); 2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::db(uint8_t data) { 2744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(data); 2746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::dd(uint32_t data) { 2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit(data); 2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(rmode != RelocInfo::NONE); 2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Don't record external references unless the heap will be serialized. 2758d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (rmode == RelocInfo::EXTERNAL_REFERENCE) { 2759d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#ifdef DEBUG 2760d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (!Serializer::enabled()) { 2761d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Serializer::TooLateToEnableNow(); 2762d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 2763d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#endif 2764d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (!Serializer::enabled() && !FLAG_debug_code) { 2765d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return; 2766d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo rinfo(pc_, rmode, data); 2769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Write(&rinfo); 2770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic FILE* coverage_log = NULL; 2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog() { 2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG"); 2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (file_name != NULL) { 2780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block coverage_log = fopen(file_name, "aw+"); 2781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid LogGeneratedCodeCoverage(const char* file_line) { 2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* return_address = (&file_line)[-1]; 2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* push_insn = const_cast<char*>(return_address - 12); 2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block push_insn[0] = 0xeb; // Relative branch insn. 2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block push_insn[1] = 13; // Skip over coverage insns. 2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (coverage_log != NULL) { 2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fprintf(coverage_log, "%s\n", file_line); 2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fflush(coverage_log); 2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 2799f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2800f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif // V8_TARGET_ARCH_IA32 2801