assembler-ia32.cc revision 69a99ed0b2b2ef69d393c371b03db3a98aaf880e
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. 35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 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 518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#ifdef DEBUG 528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool CpuFeatures::initialized_ = false; 538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#endif 548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochuint64_t CpuFeatures::supported_ = 0; 558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochuint64_t CpuFeatures::found_by_runtime_probing_ = 0; 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid CpuFeatures::Probe() { 598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(!initialized_); 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(supported_ == 0); 618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#ifdef DEBUG 628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch initialized_ = true; 638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#endif 648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (Serializer::enabled()) { 65d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block supported_ |= OS::CpuFeaturesImpliedByPlatform(); 66d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return; // No features if we might serialize. 67d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch const int kBufferSize = 4 * KB; 708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch VirtualMemory* memory = new VirtualMemory(kBufferSize); 718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (!memory->IsReserved()) { 728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch delete memory; 738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return; 748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(memory->size() >= static_cast<size_t>(kBufferSize)); 768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (!memory->Commit(memory->address(), kBufferSize, true/*executable*/)) { 778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch delete memory; 788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return; 798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Assembler assm(NULL, memory->address(), kBufferSize); 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label cpuid, done; 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define __ assm. 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Save old esp, since we are going to modify the stack. 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ebp); 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ecx); 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(ebx); 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(ebp, Operand(esp)); 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If we can modify bit 21 of the EFLAGS register, then CPUID is supported. 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(eax); 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(edx, Operand(eax)); 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, 0x200000); // Flip bit 21. 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ push(eax); 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ popfd(); 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pushfd(); 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(eax); 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, Operand(edx)); // Different if CPUID is supported. 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ j(not_zero, &cpuid); 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CPUID not supported. Clear the supported features in edx:eax. 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(eax, Operand(eax)); 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ xor_(edx, Operand(edx)); 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ jmp(&done); 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Invoke CPUID with 1 in eax to get feature information in 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ecx:edx. Temporarily enable CPUID support because we know it's 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // safe here. 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ bind(&cpuid); 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(eax, 1); 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = (1 << CPUID); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block { Scope fscope(CPUID); 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ cpuid(); 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = 0; 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Move the result from ecx:edx to edx:eax and make sure to mark the 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CPUID feature as supported. 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(eax, Operand(edx)); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ or_(eax, 1 << CPUID); 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(edx, Operand(ecx)); 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Done. 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ bind(&done); 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ mov(esp, Operand(ebp)); 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ebx); 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ecx); 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ popfd(); 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ pop(ebp); 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block __ ret(0); 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef __ 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef uint64_t (*F0)(); 1368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch F0 probe = FUNCTION_CAST<F0>(reinterpret_cast<Address>(memory->address())); 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block supported_ = probe(); 138d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block found_by_runtime_probing_ = supported_; 139d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform(); 140d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block supported_ |= os_guarantees; 1418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch found_by_runtime_probing_ &= ~os_guarantees; 1428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch delete memory; 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Displacement 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Displacement::init(Label* L, Type type) { 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!L->is_bound()); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int next = 0; 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_linked()) { 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block next = L->pos(); 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(next > 0); // Displacements must be at positions > 0 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure that we _never_ overflow the next field. 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(NextField::is_valid(Assembler::kMaximalBufferSize)); 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block data_ = NextField::encode(next) | TypeField::encode(type); 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of RelocInfo 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int RelocInfo::kApplyMask = 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 169bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE | 170bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1 << RelocInfo::DEBUG_BREAK_SLOT; 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 173f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkebool RelocInfo::IsCodedSpecially() { 174f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // The deserializer needs to know whether a pointer is specially coded. Being 175f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // specially coded on IA32 means that it is a relative address, as used by 176f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // branch instructions. These are also the ones that need changing when a 177f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // code object moves. 178f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke return (1 << rmode_) & kApplyMask; 179f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 180f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 181f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Patch the code at the current address with the supplied instructions. 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < instruction_count; i++) { 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *(pc_ + i) = *(instructions + i); 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Indicate that code has changed. 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CPU::FlushICache(pc_, instruction_count); 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Patch the code at the current PC with a call to the target address. 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Additional guard int3 instructions can be added if required. 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Call instruction takes up 5 bytes and int3 takes up one byte. 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kCallCodeSize = 5; 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int code_size = kCallCodeSize + guard_bytes; 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a code patcher. 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CodePatcher patcher(pc_, code_size); 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add a label for checking the size of the code used for returning. 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label check_codesize; 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->bind(&check_codesize); 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Patch the code. 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->call(target, RelocInfo::NONE); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the size of the code generated is as expected. 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(kCallCodeSize, 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add the requested number of int3 instructions after the call. 2177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT_GE(guard_bytes, 0); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int i = 0; i < guard_bytes; i++) { 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block patcher.masm()->int3(); 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Operand 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) { 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp/r] 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) { 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base] 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, base); 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (is_int8(disp) && rmode == RelocInfo::NONE) { 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp8] 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(1, base); 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_disp8(disp); 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + disp/r] 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(2, base); 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (base.is(esp)) set_sib(times_1, esp, base); 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register index, 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScaleFactor scale, 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t disp, 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode) { 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!index.is(esp)); // illegal addressing mode 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp/r] 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) { 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale] 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, esp); 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (is_int8(disp) && rmode == RelocInfo::NONE) { 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp8] 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(1, esp); 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_disp8(disp); 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [base + index*scale + disp/r] 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(2, esp); 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, base); 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register index, 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScaleFactor scale, 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t disp, 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode) { 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!index.is(esp)); // illegal addressing mode 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [index*scale + disp/r] 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_modrm(0, esp); 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_sib(scale, index, ebp); 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_dispr(disp, rmode); 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Operand::is_reg(Register reg) const { 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && ((buf_[0] & 0x07) == reg.code()); // register codes match. 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 2903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Implementation of Assembler. 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Emit a single byte. Must always be inlined. 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define EMIT(x) \ 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *pc_++ = (x) 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog(); 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3018b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochAssembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size) 3028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : AssemblerBase(arg_isolate), 30344f0eee88ff00398ff7f715fab053374d808c90dSteve Block positions_recorder_(this), 30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block emit_debug_code_(FLAG_debug_code) { 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer == NULL) { 3063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Do our own buffer management. 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer_size <= kMinimalBufferSize) { 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size = kMinimalBufferSize; 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (isolate()->assembler_spare_buffer() != NULL) { 31144f0eee88ff00398ff7f715fab053374d808c90dSteve Block buffer = isolate()->assembler_spare_buffer(); 31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->set_assembler_spare_buffer(NULL); 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer == NULL) { 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = NewArray<byte>(buffer_size); 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = static_cast<byte*>(buffer); 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = buffer_size; 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block own_buffer_ = true; 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 3233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Use externally provided buffer instead. 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(buffer_size > 0); 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = static_cast<byte*>(buffer); 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = buffer_size; 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block own_buffer_ = false; 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clear the buffer in debug mode unless it was provided by the 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // caller in which case we can't be sure it's okay to overwrite 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // existing code in it; see CodePatcher::CodePatcher(...). 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (own_buffer_) { 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(buffer_, 0xCC, buffer_size); // int3 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup buffer pointers. 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(buffer_ != NULL); 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ = buffer_; 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InitCoverageLog(); 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAssembler::~Assembler() { 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (own_buffer_) { 35244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (isolate()->assembler_spare_buffer() == NULL && 35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block buffer_size_ == kMinimalBufferSize) { 35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->set_assembler_spare_buffer(buffer_); 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(buffer_); 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GetCode(CodeDesc* desc) { 3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Finalize code (at this point overflow() may be true, but the gap ensures 3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // that we are still not overlapping instructions and relocation info). 3653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ASSERT(pc_ <= reloc_info_writer.pos()); // No overlap. 3663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup code descriptor. 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->buffer = buffer_; 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->buffer_size = buffer_size_; 369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->instr_size = pc_offset(); 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->origin = this; 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() { 3898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(CPUID)); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA2); 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushad() { 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x60); 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popad() { 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x61); 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushfd() { 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9C); 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popfd() { 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9D); 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Immediate& x) { 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (x.is_int8()) { 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x6a); 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(x.x_); 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x68); 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::push_imm32(int32_t imm32) { 433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x68); 435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit(imm32); 436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(Register src) { 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x50 | src.code()); 442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Operand& src) { 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esi, src); 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid Assembler::push(Handle<Object> handle) { 4533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EnsureSpace ensure_space(this); 4543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EMIT(0x68); 4553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch emit(handle); 4563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 4573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(Register dst) { 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reloc_info_writer.last_pc() != NULL); 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x58 | dst.code()); 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(const Operand& dst) { 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8F); 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::enter(const Immediate& size) { 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC8); 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_w(size); 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0); 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::leave() { 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC9); 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(Register dst, const Operand& src) { 488e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(dst.code() < 4); 489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8A); 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, int8_t imm8) { 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC6); 498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, Register src) { 504e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(src.code() < 4); 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x88); 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(Register dst, const Operand& src) { 512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8B); 515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(const Operand& dst, Register src) { 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, int32_t imm32) { 528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm32); 531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Immediate& x) { 535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Handle<Object> handle) { 542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB8 | dst.code()); 544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(handle); 545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Operand& src) { 549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8B); 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Register src) { 556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | src.code() << 3 | dst.code()); 559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, const Immediate& x) { 563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC7); 565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Handle<Object> handle) { 571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC7); 573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(handle); 575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Register src) { 579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x89); 581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_b(Register dst, const Operand& src) { 586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xBE); 589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_w(Register dst, const Operand& src) { 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xBF); 597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_b(Register dst, const Operand& src) { 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB6); 605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_w(Register dst, const Operand& src) { 610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xB7); 613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, int32_t imm32) { 6188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(CMOV)); 619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNIMPLEMENTED(); 621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(cc); 622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(dst); 623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(imm32); 624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, Handle<Object> handle) { 6288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(CMOV)); 629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNIMPLEMENTED(); 631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(cc); 632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(dst); 633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block USE(handle); 634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) { 6388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(CMOV)); 639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 6403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Opcode: 0f 40 + cc /r. 641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x40 + cc); 643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6476ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cld() { 6486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 6496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xFC); 6506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 6516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 653e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::rep_movs() { 654e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 655e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 656e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xA5); 657e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 658e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 659e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 6606ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::rep_stos() { 6616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 6626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF3); 6636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xAB); 6646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 6656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 667f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkevoid Assembler::stos() { 668f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke EnsureSpace ensure_space(this); 669f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke EMIT(0xAB); 670f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 671f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 672f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xchg(Register dst, Register src) { 674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 6753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (src.is(eax) || dst.is(eax)) { // Single-byte encoding. 676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90 | (src.is(eax) ? dst.code() : src.code())); 677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x87); 679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | src.code() << 3 | dst.code()); 680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, int32_t imm32) { 685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(2, Operand(dst), Immediate(imm32)); 687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, const Operand& src) { 691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x13); 693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(Register dst, const Operand& src) { 698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x03); 700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(const Operand& dst, const Immediate& x) { 705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reloc_info_writer.last_pc() != NULL); 706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(0, dst, x); 708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, int32_t imm32) { 71259151504615d929945dc59db37bf1166937748c6Steve Block and_(dst, Immediate(imm32)); 71359151504615d929945dc59db37bf1166937748c6Steve Block} 71459151504615d929945dc59db37bf1166937748c6Steve Block 71559151504615d929945dc59db37bf1166937748c6Steve Block 71659151504615d929945dc59db37bf1166937748c6Steve Blockvoid Assembler::and_(Register dst, const Immediate& x) { 717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 71859151504615d929945dc59db37bf1166937748c6Steve Block emit_arith(4, Operand(dst), x); 719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, const Operand& src) { 723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x23); 725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, const Immediate& x) { 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(4, dst, x); 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, Register src) { 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x21); 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb(const Operand& op, int8_t imm8) { 743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80); 745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, op); // edi == 7 746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 750d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarkevoid Assembler::cmpb(const Operand& dst, Register src) { 751d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke ASSERT(src.is_byte_register()); 752d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EnsureSpace ensure_space(this); 753d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EMIT(0x38); 754d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke emit_operand(src, dst); 755d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke} 756d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 757d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 758d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarkevoid Assembler::cmpb(Register dst, const Operand& src) { 759d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke ASSERT(dst.is_byte_register()); 760d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EnsureSpace ensure_space(this); 761d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke EMIT(0x3A); 762d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke emit_operand(dst, src); 763d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke} 764d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 765d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw(const Operand& op, Immediate imm16) { 767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(imm16.is_int16()); 768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x81); 771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, op); 772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_w(imm16); 773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, int32_t imm32) { 777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, Operand(reg), Immediate(imm32)); 779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, Handle<Object> handle) { 783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, Operand(reg), Immediate(handle)); 785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, const Operand& op) { 789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x3B); 791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(reg, op); 792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, const Immediate& imm) { 796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, op, imm); 798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, Handle<Object> handle) { 802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(7, op, Immediate(handle)); 804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb_al(const Operand& op) { 808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x38); // CMP r/m8, r8 810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); // eax has same code as register al. 811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw_ax(const Operand& op) { 815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x66); 817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x39); // CMP r/m16, r16 818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); // eax has same code as register ax. 819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec_b(Register dst) { 823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFE); 825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC8 | dst.code()); 826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8290d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::dec_b(const Operand& dst) { 8300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 8310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xFE); 8320d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_operand(ecx, dst); 8330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 8340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 8350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(Register dst) { 837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x48 | dst.code()); 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(const Operand& dst) { 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ecx, dst); 846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cdq() { 850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x99); 852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::idiv(Register src) { 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | src.code()); 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register reg) { 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8 | reg.code()); 866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, const Operand& src) { 870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAF); 873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, Register src, int32_t imm32) { 878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(imm32)) { 880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x6B); 881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm32); 883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x69); 885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm32); 887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(Register dst) { 892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x40 | dst.code()); 894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(const Operand& dst) { 898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, dst); 901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::lea(Register dst, const Operand& src) { 905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x8D); 907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mul(Register src) { 912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | src.code()); 915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::neg(Register dst) { 919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD8 | dst.code()); 922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::not_(Register dst) { 926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, int32_t imm32) { 933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(1, Operand(dst), Immediate(imm32)); 935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, const Operand& src) { 939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0B); 941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, const Immediate& x) { 946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(1, dst, x); 948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, Register src) { 952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x09); 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rcl(Register dst, uint8_t imm8) { 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD0 | dst.code()); 967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 972756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Assembler::rcr(Register dst, uint8_t imm8) { 973756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EnsureSpace ensure_space(this); 974756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(is_uint5(imm8)); // illegal shift count 975756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (imm8 == 1) { 976756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD1); 977756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD8 | dst.code()); 978756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } else { 979756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xC1); 980756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(0xD8 | dst.code()); 981756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick EMIT(imm8); 982756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 983756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 984756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 985756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sar(Register dst, uint8_t imm8) { 987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1000d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid Assembler::sar_cl(Register dst) { 1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD3); 1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8 | dst.code()); 1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sbb(Register dst, const Operand& src) { 1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x1B); 1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shld(Register dst, const Operand& src) { 1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA5); 1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shl(Register dst, uint8_t imm8) { 1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm8 == 1) { 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD1); 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC1); 1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1036d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid Assembler::shl_cl(Register dst) { 1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD3); 1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0 | dst.code()); 1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shrd(Register dst, const Operand& src) { 1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAD); 1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shr(Register dst, uint8_t imm8) { 1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint5(imm8)); // illegal shift count 1054d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (imm8 == 1) { 1055d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xD1); 1056d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xE8 | dst.code()); 1057d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } else { 1058d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xC1); 1059d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xE8 | dst.code()); 1060d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(imm8); 1061d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shr_cl(Register dst) { 1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1067d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block EMIT(0xD3); 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8 | dst.code()); 1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::subb(const Operand& op, int8_t imm8) { 10733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 10743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (op.is_reg(eax)) { 10753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0x2c); 10763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } else { 10773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0x80); 10783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block emit_operand(ebp, op); // ebp == 5 10793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 10803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(imm8); 10813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 10823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 10833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, const Immediate& x) { 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(5, dst, x); 1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(Register dst, const Operand& src) { 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2B); 1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1097e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::subb(Register dst, const Operand& src) { 1098e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(dst.code() < 4); 1099e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1100e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x2A); 1101e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(dst, src); 1102e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1103e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1104e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, Register src) { 1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x29); 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Immediate& imm) { 1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only use test against byte for registers that have a byte 1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // variant: eax, ebx, ecx, and edx. 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm.rmode_ == RelocInfo::NONE && is_uint8(imm.x_) && reg.code() < 4) { 1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t imm8 = imm.x_; 1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (reg.is(eax)) { 1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA8); 1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith_b(0xF6, 0xC0, reg, imm8); 1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // This is not using emit_arith because test doesn't support 1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sign-extension of 8-bit operands. 1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (reg.is(eax)) { 1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA9); 1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | reg.code()); 1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm); 1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Operand& op) { 1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x85); 1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(reg, op); 1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1145e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::test_b(Register reg, const Operand& op) { 1146e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1147e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x84); 1148e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(reg, op); 1149e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1150e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1151e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(const Operand& op, const Immediate& imm) { 1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, op); 1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(imm); 1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::test_b(const Operand& op, uint8_t imm8) { 11617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 11627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0xF6); 11637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_operand(eax, op); 11647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(imm8); 11657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 11667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 11677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, int32_t imm32) { 1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(6, Operand(dst), Immediate(imm32)); 1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, const Operand& src) { 1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x33); 1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& src, Register dst) { 1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x31); 1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& dst, const Immediate& x) { 1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_arith(6, dst, x); 1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bt(const Operand& dst, Register src) { 1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xA3); 1198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bts(const Operand& dst, Register src) { 1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xAB); 1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(src, dst); 1207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::hlt() { 1211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF4); 1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::int3() { 1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xCC); 1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::nop() { 1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90); 1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rdtsc() { 12298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(RDTSC)); 1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x31); 1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ret(int imm16) { 1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint16(imm16)); 1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (imm16 == 0) { 1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC3); 1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC2); 1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm16 & 0xFF); 1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((imm16 >> 8) & 0xFF); 1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Labels refer to positions in the (to be) generated code. 1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There are bound, linked, and unused labels. 1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Bound labels refer to known positions in the already 1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// generated code. pos() is the position the label refers to. 1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Linked labels refer to unknown positions in the code 1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be generated; pos() is the position of the 32bit 1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Displacement of the last instruction using the label. 1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::print(Label* L) { 1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_unused()) { 1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("unused label\n"); 1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (L->is_bound()) { 1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("bound label to %d\n", L->pos()); 1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (L->is_linked()) { 1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Label l = *L; 1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("unbound label"); 1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while (l.is_linked()) { 1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Displacement disp = disp_at(&l); 1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("@ %d ", l.pos()); 1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.print(); 1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("\n"); 1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.next(&l); 1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind_to(Label* L, int pos) { 1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= pos && pos <= pc_offset()); // must have a valid binding position 1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block while (L->is_linked()) { 1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Displacement disp = disp_at(L); 1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int fixup_pos = L->pos(); 1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp.type() == Displacement::CODE_RELATIVE) { 1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Relative to Code* heap object pointer. 1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); 1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 12943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Relative address, relative to point after address. 1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block long_at_put(fixup_pos, imm32); 1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block disp.next(L); 1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch while (L->is_near_linked()) { 1301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int fixup_pos = L->near_link_pos(); 1302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int offset_to_next = 1303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 1304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(offset_to_next <= 0); 1305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Relative address, relative to point after address. 1306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int disp = pos - fixup_pos - sizeof(int8_t); 1307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(0 <= disp && disp <= 127); 1308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_byte_at(fixup_pos, disp); 1309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (offset_to_next < 0) { 1310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch L->link_to(fixup_pos + offset_to_next, Label::kNear); 1311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch L->UnuseNear(); 1313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block L->bind_to(pos); 1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind(Label* L) { 1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!L->is_bound()); // label can only be bound once 1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bind_to(L, pc_offset()); 1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Label* L) { 1327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 5; 1331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 13333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1000 #32-bit disp. 1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 13373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1000 #32-bit disp. 1338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::OTHER); 1340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) { 1345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!RelocInfo::IsCodeTarget(rmode)); 1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(const Operand& adr) { 1354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Call size is 1 (opcode) + adr.len_ (operand). 1355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return 1 + adr.len_; 1356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(const Operand& adr) { 1360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch positions_recorder()->WriteRecordedPositions(); 1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edx, adr); 1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) { 1368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return 1 /* EMIT */ + sizeof(uint32_t) /* emit */; 1369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::call(Handle<Code> code, 1373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch RelocInfo::Mode rmode, 1374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch unsigned ast_id) { 13753e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(RelocInfo::IsCodeTarget(rmode)); 1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch emit(reinterpret_cast<intptr_t>(code.location()), rmode, ast_id); 1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::jmp(Label* L, Label::Distance distance) { 1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int short_size = 2; 1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 5; 1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(offs - short_size)) { 13913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1011 #8-bit disp. 1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xEB); 1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((offs - short_size) & 0xFF); 1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 13953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1001 #32-bit disp. 1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (distance == Label::kNear) { 1400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EMIT(0xEB); 1401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch emit_near_disp(L); 1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 14033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 1110 1001 #32-bit disp. 1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!RelocInfo::IsCodeTarget(rmode)); 1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(const Operand& adr) { 1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esp, adr); 1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) { 1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(RelocInfo::IsCodeTarget(rmode)); 1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(reinterpret_cast<intptr_t>(code.location()), rmode); 1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 14340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= cc && cc < 16); 1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (L->is_bound()) { 1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int short_size = 2; 1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int long_size = 6; 1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offs = L->pos() - pc_offset(); 1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(offs <= 0); 1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_int8(offs - short_size)) { 1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0111 tttn #8-bit disp 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x70 | cc); 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((offs - short_size) & 0xFF); 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(offs - long_size); 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (distance == Label::kNear) { 1452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EMIT(0x70 | cc); 1453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch emit_near_disp(L); 1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note: could eliminate cond. jumps to this jump if condition 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // is the same however, seems to be rather unlikely case. 1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_disp(L, Displacement::OTHER); 1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) { 1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((0 <= cc) && (cc < 16)); 14683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // 0000 1111 1000 tttn #32-bit disp. 1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(entry - (pc_ + sizeof(int32_t)), rmode); 1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, Handle<Code> code) { 1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 0000 1111 1000 tttn #32-bit disp 1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x80 | cc); 1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(reinterpret_cast<intptr_t>(code.location()), RelocInfo::CODE_TARGET); 1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// FPU instructions. 1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld(int i) { 1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xD9, 0xC0, i); 1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1492402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fstp(int i) { 1493402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1494402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu emit_farith(0xDD, 0xD8, i); 1495402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1496402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1497402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld1() { 1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE8); 1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1505402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fldpi() { 1506402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1507402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xD9); 1508402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xEB); 1509402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1510402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1511402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fldz() { 1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xEE); 1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fldln2() { 1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xD9); 1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xED); 1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_s(const Operand& adr) { 1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_d(const Operand& adr) { 1534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDD); 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_s(const Operand& adr) { 1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_d(const Operand& adr) { 1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDD); 1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1554402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fst_d(const Operand& adr) { 1555402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EnsureSpace ensure_space(this); 1556402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu EMIT(0xDD); 1557402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu emit_operand(edx, adr); 1558402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu} 1559402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1560402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_s(const Operand& adr) { 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(eax, adr); 1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_d(const Operand& adr) { 1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebp, adr); 1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_s(const Operand& adr) { 1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ebx, adr); 1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisttp_s(const Operand& adr) { 15838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE3)); 1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ecx, adr); 1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1590e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::fisttp_d(const Operand& adr) { 15918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE3)); 1592e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1593e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xDD); 1594e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_operand(ecx, adr); 1595e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1596e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1597e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fist_s(const Operand& adr) { 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edx, adr); 1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_d(const Operand& adr) { 1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(edi, adr); 1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fabs() { 1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE1); 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fchs() { 1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0); 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcos() { 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFF); 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsin() { 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFE); 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fyl2x() { 1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xD9); 1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xF1); 1644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fadd(int i) { 1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xC0, i); 1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsub(int i) { 1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xE8, i); 1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisub_s(const Operand& adr) { 1660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDA); 1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(esp, adr); 1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmul(int i) { 1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xC8, i); 1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdiv(int i) { 1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDC, 0xF8, i); 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::faddp(int i) { 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xC0, i); 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubp(int i) { 1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xE8, i); 1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubrp(int i) { 1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xE0, i); 1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmulp(int i) { 1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xC8, i); 1699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdivp(int i) { 1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDE, 0xF8, i); 1705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem() { 1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF8); 1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem1() { 1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF5); 1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fxch(int i) { 1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xD9, 0xC8, i); 1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fincstp() { 1729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF7); 1732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ffree(int i) { 1736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDD, 0xC0, i); 1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ftst() { 1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE4); 1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucomp(int i) { 1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_farith(0xDD, 0xE8, i); 1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucompp() { 1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDA); 1757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE9); 1758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomi(int i) { 17623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 17633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xDB); 17643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xE8 + i); 17653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 17663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 17673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 17683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomip() { 17693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EnsureSpace ensure_space(this); 17703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xDF); 17713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EMIT(0xE9); 17723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 17733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 17743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 1775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcompp() { 1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDE); 1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnstsw_ax() { 1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDF); 1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE0); 1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fwait() { 1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9B); 1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::frndint() { 1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xD9); 1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xFC); 1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnclex() { 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xDB); 1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xE2); 1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sahf() { 1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x9E); 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::setcc(Condition cc, Register reg) { 1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reg.is_byte_register()); 1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x90 | cc); 1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | reg.code()); 1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttss2si(Register dst, const Operand& src) { 18258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF3); 1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2C); 1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttsd2si(Register dst, const Operand& src) { 18358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2C); 1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(dst, src); 1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) { 18458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x2A); 1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { 18558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 18566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 18576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF3); 18586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 18596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x5A); 18606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 18616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 18626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 18636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 186444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { 18658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 186644f0eee88ff00398ff7f715fab053374d808c90dSteve Block EnsureSpace ensure_space(this); 186744f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0xF2); 186844f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x0F); 186944f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x5A); 187044f0eee88ff00398ff7f715fab053374d808c90dSteve Block emit_sse_operand(dst, src); 187144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 187244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 187344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::addsd(XMMRegister dst, XMMRegister src) { 18758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x58); 1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mulsd(XMMRegister dst, XMMRegister src) { 18858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x59); 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::subsd(XMMRegister dst, XMMRegister src) { 18958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x5C); 1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::divsd(XMMRegister dst, XMMRegister src) { 19058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); 1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x5E); 1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1914e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::xorpd(XMMRegister dst, XMMRegister src) { 19158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 1916e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 1917e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 1918e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 1919e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x57); 1920e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 1921e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 1922e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1923e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1924257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::xorps(XMMRegister dst, XMMRegister src) { 1925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EnsureSpace ensure_space(this); 1926257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EMIT(0x0F); 1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EMIT(0x57); 1928257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch emit_sse_operand(dst, src); 1929257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 19326ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { 19336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 19346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF2); 19356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 19366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x51); 19376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 19386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 19396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19410d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::andpd(XMMRegister dst, XMMRegister src) { 19420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 19430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x66); 19440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 19450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x54); 19460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 19470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 19480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 19490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 19506ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ucomisd(XMMRegister dst, XMMRegister src) { 19518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 19526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 19536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 19546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 19556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x2E); 19566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 19576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 19586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 196069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) { 196169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 196269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EnsureSpace ensure_space(this); 196369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EMIT(0x66); 196469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EMIT(0x0F); 196569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EMIT(0x3A); 196669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EMIT(0x0B); 196769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch emit_sse_operand(dst, src); 196869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Mask precision exeption. 196969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch EMIT(static_cast<byte>(mode) | 0x8); 197069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 197169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 19726ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movmskpd(Register dst, XMMRegister src) { 19738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 19746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 19756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 19766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 19776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x50); 19786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 19796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 19806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19820d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { 19838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 19840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 19850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xF2); 19860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 19870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0xC2); 19880d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 19890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(1); // LT == 1 19900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 19910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 19920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 19930d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movaps(XMMRegister dst, XMMRegister src) { 19948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 19950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 19960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 19970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x28); 19980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(dst, src); 19990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 20000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 20010d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 20020d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movdqa(const Operand& dst, XMMRegister src) { 20038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2004e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2005e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 2006e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2007e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x7F); 2008e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(src, dst); 2009e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2010e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2011e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2012e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqa(XMMRegister dst, const Operand& src) { 20138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2014e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2015e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x66); 2016e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2017e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x6F); 2018e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 2019e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2020e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2021e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2022e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(const Operand& dst, XMMRegister src ) { 20238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2024e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2025e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 2026e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2027e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x7F); 2028e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(src, dst); 2029e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2030e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2031e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2032e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(XMMRegister dst, const Operand& src) { 20338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2034e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EnsureSpace ensure_space(this); 2035e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0xF3); 2036e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x0F); 2037e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke EMIT(0x6F); 2038e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke emit_sse_operand(dst, src); 2039e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 2040e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2041e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 20427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::movntdqa(XMMRegister dst, const Operand& src) { 20438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 20447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 20457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x66); 20467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 20477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x38); 20487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x2A); 20497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(dst, src); 20507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 20517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 20527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 20537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::movntdq(const Operand& dst, XMMRegister src) { 20548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 20557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 20567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x66); 20577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 20587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0xE7); 20597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(src, dst); 20607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 20617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 20627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 20637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::prefetch(const Operand& src, int level) { 20647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(is_uint2(level)); 20657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 20667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x0F); 20677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EMIT(0x18); 20687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch XMMRegister code = { level }; // Emit hint number in Reg position of RegR/M. 20697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch emit_sse_operand(code, src); 20707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 20717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 20727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movdbl(XMMRegister dst, const Operand& src) { 2074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block movsd(dst, src); 2076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movdbl(const Operand& dst, XMMRegister src) { 2080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block movsd(dst, src); 2082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(const Operand& dst, XMMRegister src ) { 20868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); // double 2089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x11); // store 2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(src, dst); 2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(XMMRegister dst, const Operand& src) { 20968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xF2); // double 2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x0F); 2100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x10); // load 2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_sse_operand(dst, src); 2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21056ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movsd(XMMRegister dst, XMMRegister src) { 21068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 21076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 21086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xF2); 21096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 21106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x10); 21116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 21126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 21136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 211544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(const Operand& dst, XMMRegister src ) { 21168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 211744f0eee88ff00398ff7f715fab053374d808c90dSteve Block EnsureSpace ensure_space(this); 211844f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0xF3); // float 211944f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x0F); 212044f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x11); // store 212144f0eee88ff00398ff7f715fab053374d808c90dSteve Block emit_sse_operand(src, dst); 212244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 212344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 212444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 212544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(XMMRegister dst, const Operand& src) { 21268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 212744f0eee88ff00398ff7f715fab053374d808c90dSteve Block EnsureSpace ensure_space(this); 212844f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0xF3); // float 212944f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x0F); 213044f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x10); // load 213144f0eee88ff00398ff7f715fab053374d808c90dSteve Block emit_sse_operand(dst, src); 213244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 213344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 213444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 213544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(XMMRegister dst, XMMRegister src) { 21368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 213744f0eee88ff00398ff7f715fab053374d808c90dSteve Block EnsureSpace ensure_space(this); 213844f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0xF3); 213944f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x0F); 214044f0eee88ff00398ff7f715fab053374d808c90dSteve Block EMIT(0x10); 214144f0eee88ff00398ff7f715fab053374d808c90dSteve Block emit_sse_operand(dst, src); 214244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 214344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 214444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21456ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movd(XMMRegister dst, const Operand& src) { 21468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 21476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 21486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 21496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 21506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x6E); 21516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 21526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 21536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::movd(const Operand& dst, XMMRegister src) { 21568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x7E); 2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(src, dst); 2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pand(XMMRegister dst, XMMRegister src) { 21668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0xDB); 2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(dst, src); 2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21756ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::pxor(XMMRegister dst, XMMRegister src) { 21768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 21776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 21786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 21796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 21806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xEF); 21816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 21826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 21836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::por(XMMRegister dst, XMMRegister src) { 21868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2189b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xEB); 2191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 21956ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ptest(XMMRegister dst, XMMRegister src) { 21968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 21976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EnsureSpace ensure_space(this); 21986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x66); 21996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x0F); 22006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x38); 22016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0x17); 22026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block emit_sse_operand(dst, src); 22036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::psllq(XMMRegister reg, int8_t shift) { 22078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 22080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EnsureSpace ensure_space(this); 22090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x66); 22100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x0F); 22110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen EMIT(0x73); 22120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen emit_sse_operand(esi, reg); // esi == 6 2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(shift); 2214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2217b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psllq(XMMRegister dst, XMMRegister src) { 22188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xF3); 2223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister reg, int8_t shift) { 22288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x73); 2233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(edx, reg); // edx == 2 2234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(shift); 2235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) { 22398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EnsureSpace ensure_space(this); 2241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x66); 2242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0x0F); 2243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch EMIT(0xD3); 2244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch emit_sse_operand(dst, src); 2245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle) { 22498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE2)); 2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x70); 2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(dst, src); 2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(shuffle); 2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) { 22608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x66); 2263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x0F); 2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x3A); 2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(0x16); 2266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit_sse_operand(src, dst); 2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(offset); 22681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 22691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) { 22728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ASSERT(CpuFeatures::IsEnabled(SSE4_1)); 22731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EnsureSpace ensure_space(this); 22741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x66); 22751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x0F); 22761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x3A); 22771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(0x22); 22781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block emit_sse_operand(dst, src); 22791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block EMIT(offset); 22800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 2283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { 2284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register ireg = { reg.code() }; 2285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, adr); 2286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { 2290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 2291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22946ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) { 22956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block EMIT(0xC0 | dst.code() << 3 | src.code()); 22966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Print() { 2300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Disassembler::Decode(stdout, buffer_, pc_); 2301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordJSReturn() { 23053e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(RelocInfo::JS_RETURN); 2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::RecordDebugBreakSlot() { 23123e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu positions_recorder()->WriteRecordedPositions(); 23137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch EnsureSpace ensure_space(this); 23147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 23157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 23167f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 23177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Assembler::RecordComment(const char* msg, bool force) { 2319e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (FLAG_code_comments || force) { 2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GrowBuffer() { 23273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ASSERT(overflow()); 2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!own_buffer_) FATAL("external code buffer is too small"); 2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Compute new buffer size. 2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CodeDesc desc; // the new buffer 2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (buffer_size_ < 4*KB) { 2333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer_size = 4*KB; 2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer_size = 2*buffer_size_; 2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Some internal data structures overflow for very large buffers, 2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // they must ensure that kMaximalBufferSize is not too large. 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if ((desc.buffer_size > kMaximalBufferSize) || 234044f0eee88ff00398ff7f715fab053374d808c90dSteve Block (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) { 2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 2342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup new buffer. 2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.buffer = NewArray<byte>(desc.buffer_size); 2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.instr_size = pc_offset(); 2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos()); 2348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clear the buffer in debug mode. Use 'int3' instructions to make 2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sure to get into problems if we ever run uninitialized code. 2351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 2352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(desc.buffer, 0xCC, desc.buffer_size); 2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Copy the data. 2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int pc_delta = desc.buffer - buffer_; 2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memmove(desc.buffer, buffer_, desc.instr_size); 2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memmove(rc_delta + reloc_info_writer.pos(), 2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.pos(), desc.reloc_size); 2361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Switch buffers. 236344f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (isolate()->assembler_spare_buffer() == NULL && 236444f0eee88ff00398ff7f715fab053374d808c90dSteve Block buffer_size_ == kMinimalBufferSize) { 236544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->set_assembler_spare_buffer(buffer_); 2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DeleteArray(buffer_); 2368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = desc.buffer; 2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_size_ = desc.buffer_size; 2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += pc_delta; 2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.last_pc() + pc_delta); 2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Relocate runtime entries. 2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (RelocIterator it(desc); !it.done(); it.next()) { 2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo::Mode rmode = it.rinfo()->rmode(); 2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (rmode == RelocInfo::RUNTIME_ENTRY) { 2379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 2380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *p -= pc_delta; // relocate entry 2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (rmode == RelocInfo::INTERNAL_REFERENCE) { 2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (*p != 0) { // 0 means uninitialized. 2384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *p += pc_delta; 2385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!overflow()); 2390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { 2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(op1) && is_uint8(op2)); // wrong opcode 2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(imm8)); 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((op1 & 0x01) == 0); // should be 8bit operation 2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(op1); 2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(op2 | dst.code()); 2399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(imm8); 2400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { 2404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((0 <= sel) && (sel <= 7)); 2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Register ireg = { sel }; 2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (x.is_int8()) { 2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x83); // using a sign-extended 8-bit immediate. 2408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, dst); 2409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(x.x_ & 0xFF); 2410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else if (dst.is_reg(eax)) { 2411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT((sel << 3) | 0x05); // short form if the destination is eax. 2412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 2413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(0x81); // using a literal 32-bit immediate. 2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit_operand(ireg, dst); 2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block emit(x); 2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_operand(Register reg, const Operand& adr) { 2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const unsigned length = adr.len_; 2423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(length > 0); 2424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit updated ModRM byte containing the given register. 2426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); 2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit the rest of the encoded operand. 2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += length; 2431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emit relocation information if necessary. 2433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (length >= sizeof(int32_t) && adr.rmode_ != RelocInfo::NONE) { 2434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 2435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RecordRelocInfo(adr.rmode_); 2436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block pc_ += sizeof(int32_t); 2437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_farith(int b1, int b2, int i) { 2442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= i && i < 8); // illegal stack offset 2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(b1); 2445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EMIT(b2 + i); 2446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::db(uint8_t data) { 2450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EnsureSpace ensure_space(this); 2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch EMIT(data); 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::dd(uint32_t data) { 2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EnsureSpace ensure_space(this); 2457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch emit(data); 2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(rmode != RelocInfo::NONE); 2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Don't record external references unless the heap will be serialized. 2464d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (rmode == RelocInfo::EXTERNAL_REFERENCE) { 2465d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#ifdef DEBUG 2466d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (!Serializer::enabled()) { 2467d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Serializer::TooLateToEnableNow(); 2468d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 2469d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#endif 247044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!Serializer::enabled() && !emit_debug_code()) { 2471d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return; 2472d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 2473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RelocInfo rinfo(pc_, rmode, data); 2475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reloc_info_writer.Write(&rinfo); 2476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE 2480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic FILE* coverage_log = NULL; 2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog() { 2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG"); 2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (file_name != NULL) { 2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block coverage_log = fopen(file_name, "aw+"); 2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid LogGeneratedCodeCoverage(const char* file_line) { 2492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* return_address = (&file_line)[-1]; 2493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* push_insn = const_cast<char*>(return_address - 12); 2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block push_insn[0] = 0xeb; // Relative branch insn. 2495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block push_insn[1] = 13; // Skip over coverage insns. 2496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (coverage_log != NULL) { 2497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fprintf(coverage_log, "%s\n", file_line); 2498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fflush(coverage_log); 2499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 2505f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2506f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif // V8_TARGET_ARCH_IA32 2507