1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright (c) 1994-2006 Sun Microsystems Inc. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// All Rights Reserved. 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// are met: 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Redistributions of source code must retain the above copyright notice, 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// this list of conditions and the following disclaimer. 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Redistribution in binary form must reproduce the above copyright 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer in the 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// documentation and/or other materials provided with the 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// distribution. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Neither the name of Sun Microsystems or the names of contributors may 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// be used to endorse or promote products derived from this software without 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// specific prior written permission. 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THE POSSIBILITY OF SUCH DAMAGE. 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The original source code covered by the above license above has been modified 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// significantly by Google Inc. 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/x87/assembler-x87.h" 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_X87 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/cpu.h" 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disassembler.h" 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h" 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h" 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of CpuFeatures 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::ProbeImpl(bool cross_compile) { 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::CPU cpu; 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only use statically determined features for cross compile (snapshot). 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cross_compile) return; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::PrintTarget() { } 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::PrintFeatures() { } 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of Displacement 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Displacement::init(Label* L, Type type) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!L->is_bound()); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int next = 0; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (L->is_linked()) { 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next = L->pos(); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(next > 0); // Displacements must be at positions > 0 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure that we _never_ overflow the next field. 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(NextField::is_valid(Assembler::kMaximalBufferSize)); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data_ = NextField::encode(next) | TypeField::encode(type); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of RelocInfo 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int RelocInfo::kApplyMask = 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1 << RelocInfo::INTERNAL_REFERENCE | 1 << RelocInfo::CODE_AGE_SEQUENCE | 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::kDebugBreakSlotMask; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::IsCodedSpecially() { 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The deserializer needs to know whether a pointer is specially coded. Being 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // specially coded on IA32 means that it is a relative address, as used by 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // branch instructions. These are also the ones that need changing when a 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // code object moves. 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (1 << rmode_) & kApplyMask; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::IsInConstantPool() { 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochAddress RelocInfo::wasm_memory_reference() { 105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(IsWasmMemoryReference(rmode_)); 106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Memory::Address_at(pc_); 107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 108bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 10913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochAddress RelocInfo::wasm_global_reference() { 11013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(IsWasmGlobalReference(rmode_)); 11113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return Memory::Address_at(pc_); 11213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 11313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochuint32_t RelocInfo::wasm_memory_size_reference() { 115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(IsWasmMemorySizeReference(rmode_)); 116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return Memory::uint32_at(pc_); 117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 11913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::unchecked_update_wasm_memory_reference( 12013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Address address, ICacheFlushMode flush_mode) { 12113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Memory::Address_at(pc_) = address; 12213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 12313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 12413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::unchecked_update_wasm_memory_size(uint32_t size, 12513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ICacheFlushMode flush_mode) { 12613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Memory::uint32_at(pc_) = size; 127bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of Operand 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) { 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + disp/r] 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base] 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(0, base); 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (base.is(esp)) set_sib(times_1, esp, base); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + disp8] 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(1, base); 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (base.is(esp)) set_sib(times_1, esp, base); 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_disp8(disp); 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + disp/r] 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(2, base); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (base.is(esp)) set_sib(times_1, esp, base); 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_dispr(disp, rmode); 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Register base, 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register index, 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScaleFactor scale, 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t disp, 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::Mode rmode) { 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!index.is(esp)); // illegal addressing mode 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + index*scale + disp/r] 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + index*scale] 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(0, esp); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_sib(scale, index, base); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + index*scale + disp8] 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(1, esp); 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_sib(scale, index, base); 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_disp8(disp); 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [base + index*scale + disp/r] 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(2, esp); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_sib(scale, index, base); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_dispr(disp, rmode); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOperand::Operand(Register index, 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScaleFactor scale, 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t disp, 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::Mode rmode) { 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!index.is(esp)); // illegal addressing mode 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [index*scale + disp/r] 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_modrm(0, esp); 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_sib(scale, index, ebp); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_dispr(disp, rmode); 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::is_reg(Register reg) const { 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && ((buf_[0] & 0x07) == reg.code()); // register codes match. 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Operand::is_reg_only() const { 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (buf_[0] & 0xF8) == 0xC0; // Addressing mode is register only. 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochRegister Operand::reg() const { 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_reg_only()); 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Register::from_code(buf_[0] & 0x07); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------- 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Implementation of Assembler. 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Emit a single byte. Must always be inlined. 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define EMIT(x) \ 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *pc_++ = (x) 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : AssemblerBase(isolate, buffer, buffer_size) { 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Clear the buffer in debug mode unless it was provided by the 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// caller in which case we can't be sure it's okay to overwrite 217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// existing code in it; see CodePatcher::CodePatcher(...). 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (own_buffer_) { 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(buffer_, 0xCC, buffer_size_); // int3 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::GetCode(CodeDesc* desc) { 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finalize code (at this point overflow() may be true, but the gap ensures 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that we are still not overlapping instructions and relocation info). 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap. 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set up code descriptor. 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc->buffer = buffer_; 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc->buffer_size = buffer_size_; 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc->instr_size = pc_offset(); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc->origin = this; 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch desc->constant_pool_size = 0; 23913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch desc->unwinding_info_size = 0; 24013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch desc->unwinding_info = nullptr; 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::Align(int m) { 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base::bits::IsPowerOfTwo32(m)); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int mask = m - 1; 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int addr = pc_offset(); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Nop((m - (addr & mask)) & mask); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Assembler::IsNop(Address addr) { 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address a = addr; 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (*a == 0x66) a++; 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*a == 0x90) return true; 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (a[0] == 0xf && a[1] == 0x1f) return true; 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::Nop(int bytes) { 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Older CPUs that do not support SSE2 may not support multibyte NOP 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // instructions. 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (; bytes > 0; bytes--) { 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x90); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::CodeTargetAlign() { 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Align(16); // Preferred alignment of jump targets on ia32. 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cpuid() { 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA2); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pushad() { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x60); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::popad() { 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x61); 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pushfd() { 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x9C); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::popfd() { 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x9D); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::push(const Immediate& x) { 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x.is_int8()) { 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x6a); 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(x.x_); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x68); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(x); 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::push_imm32(int32_t imm32) { 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x68); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(imm32); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::push(Register src) { 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x50 | src.code()); 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::push(const Operand& src) { 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esi, src); 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pop(Register dst) { 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reloc_info_writer.last_pc() != NULL); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x58 | dst.code()); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pop(const Operand& dst) { 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x8F); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::enter(const Immediate& size) { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC8); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_w(size); 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0); 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::leave() { 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC9); 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_b(Register dst, const Operand& src) { 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(dst.is_byte_register()); 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x8A); 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::mov_b(const Operand& dst, const Immediate& src) { 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xC6); 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(eax, dst); 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(static_cast<int8_t>(src.x_)); 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_b(const Operand& dst, int8_t imm8) { 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC6); 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_b(const Operand& dst, Register src) { 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(src.is_byte_register()); 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x88); 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_w(Register dst, const Operand& src) { 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x66); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x8B); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_w(const Operand& dst, Register src) { 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x66); 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x89); 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov_w(const Operand& dst, int16_t imm16) { 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x66); 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC7); 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(static_cast<int8_t>(imm16 & 0xff)); 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(static_cast<int8_t>(imm16 >> 8)); 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::mov_w(const Operand& dst, const Immediate& src) { 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0x66); 430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xC7); 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(eax, dst); 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(static_cast<int8_t>(src.x_ & 0xff)); 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(static_cast<int8_t>(src.x_ >> 8)); 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(Register dst, int32_t imm32) { 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xB8 | dst.code()); 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(imm32); 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(Register dst, const Immediate& x) { 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xB8 | dst.code()); 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(x); 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(Register dst, Handle<Object> handle) { 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xB8 | dst.code()); 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(handle); 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(Register dst, const Operand& src) { 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x8B); 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(Register dst, Register src) { 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x89); 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC0 | src.code() << 3 | dst.code()); 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(const Operand& dst, const Immediate& x) { 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC7); 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(x); 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(const Operand& dst, Handle<Object> handle) { 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC7); 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(handle); 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mov(const Operand& dst, Register src) { 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x89); 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movsx_b(Register dst, const Operand& src) { 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xBE); 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movsx_w(Register dst, const Operand& src) { 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xBF); 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movzx_b(Register dst, const Operand& src) { 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xB6); 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movzx_w(Register dst, const Operand& src) { 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xB7); 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cld() { 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFC); 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::rep_movs() { 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF3); 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA5); 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::rep_stos() { 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF3); 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xAB); 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::stos() { 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xAB); 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xchg(Register dst, Register src) { 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (src.is(eax) || dst.is(eax)) { // Single-byte encoding. 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x90 | (src.is(eax) ? dst.code() : src.code())); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x87); 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC0 | src.code() << 3 | dst.code()); 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xchg(Register dst, const Operand& src) { 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x87); 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 570bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_b(Register reg, const Operand& op) { 571bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch EnsureSpace ensure_space(this); 572bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch EMIT(0x86); 573bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch emit_operand(reg, op); 574bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 575bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 576bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_w(Register reg, const Operand& op) { 577bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch EnsureSpace ensure_space(this); 578bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch EMIT(0x66); 579bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch EMIT(0x87); 580bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch emit_operand(reg, op); 581bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::lock() { 58413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EnsureSpace ensure_space(this); 58513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0xF0); 58613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 58713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 58813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg(const Operand& dst, Register src) { 58913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EnsureSpace ensure_space(this); 59013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0x0F); 59113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0xB1); 59213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch emit_operand(src, dst); 59313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 59413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 59513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_b(const Operand& dst, Register src) { 59613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EnsureSpace ensure_space(this); 59713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0x0F); 59813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0xB0); 59913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch emit_operand(src, dst); 60013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 60113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 60213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_w(const Operand& dst, Register src) { 60313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EnsureSpace ensure_space(this); 60413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0x66); 60513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0x0F); 60613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch EMIT(0xB1); 60713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch emit_operand(src, dst); 60813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 60913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::adc(Register dst, int32_t imm32) { 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(2, Operand(dst), Immediate(imm32)); 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::adc(Register dst, const Operand& src) { 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x13); 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::add(Register dst, const Operand& src) { 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x03); 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::add(const Operand& dst, Register src) { 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x01); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::add(const Operand& dst, const Immediate& x) { 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reloc_info_writer.last_pc() != NULL); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(0, dst, x); 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::and_(Register dst, int32_t imm32) { 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch and_(dst, Immediate(imm32)); 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::and_(Register dst, const Immediate& x) { 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(4, Operand(dst), x); 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::and_(Register dst, const Operand& src) { 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x23); 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::and_(const Operand& dst, const Immediate& x) { 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(4, dst, x); 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::and_(const Operand& dst, Register src) { 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x21); 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpb(const Operand& op, Immediate imm8) { 6753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(imm8.is_int8() || imm8.is_uint8()); 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op.is_reg(eax)) { 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x3C); 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x80); 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, op); // edi == 7 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_b(imm8); 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmpb(const Operand& op, Register reg) { 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg.is_byte_register()); 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x38); 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(reg, op); 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmpb(Register reg, const Operand& op) { 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg.is_byte_register()); 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x3A); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(reg, op); 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmpw(const Operand& op, Immediate imm16) { 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(imm16.is_int16()); 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x66); 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x81); 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, op); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_w(imm16); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(Register reg, const Operand& op) { 7133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 7143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch EMIT(0x3B); 7163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(reg, op); 7173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 7183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 7193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(const Operand& op, Register reg) { 7203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 7213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 722f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch EMIT(0x39); 7233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(reg, op); 7243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmp(Register reg, int32_t imm32) { 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(7, Operand(reg), Immediate(imm32)); 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmp(Register reg, Handle<Object> handle) { 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(7, Operand(reg), Immediate(handle)); 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmp(Register reg, const Operand& op) { 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x3B); 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(reg, op); 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 744109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cmp(const Operand& op, Register reg) { 745109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch EnsureSpace ensure_space(this); 746109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch EMIT(0x39); 747109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch emit_operand(reg, op); 748109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmp(const Operand& op, const Immediate& imm) { 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(7, op, imm); 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmp(const Operand& op, Handle<Object> handle) { 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(7, op, Immediate(handle)); 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmpb_al(const Operand& op) { 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x38); // CMP r/m8, r8 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, op); // eax has same code as register al. 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cmpw_ax(const Operand& op) { 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x66); 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x39); // CMP r/m16, r16 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, op); // eax has same code as register ax. 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::dec_b(Register dst) { 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(dst.is_byte_register()); 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFE); 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC8 | dst.code()); 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::dec_b(const Operand& dst) { 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFE); 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ecx, dst); 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::dec(Register dst) { 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x48 | dst.code()); 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::dec(const Operand& dst) { 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ecx, dst); 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cdq() { 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x99); 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::idiv(const Operand& src) { 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, src); 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::div(const Operand& src) { 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esi, src); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register reg) { 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8 | reg.code()); 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, const Operand& src) { 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xAF); 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, Register src, int32_t imm32) { 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch imul(dst, Operand(src), imm32); 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) { 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_int8(imm32)) { 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x6B); 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm32); 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x69); 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(imm32); 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::inc(Register dst) { 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x40 | dst.code()); 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::inc(const Operand& dst) { 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, dst); 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::lea(Register dst, const Operand& src) { 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x8D); 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mul(Register src) { 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE0 | src.code()); 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::neg(Register dst) { 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD8 | dst.code()); 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::neg(const Operand& dst) { 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebx, dst); 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::not_(Register dst) { 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD0 | dst.code()); 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::not_(const Operand& dst) { 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edx, dst); 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::or_(Register dst, int32_t imm32) { 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(1, Operand(dst), Immediate(imm32)); 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::or_(Register dst, const Operand& src) { 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0B); 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::or_(const Operand& dst, const Immediate& x) { 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(1, dst, x); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::or_(const Operand& dst, Register src) { 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x09); 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::rcl(Register dst, uint8_t imm8) { 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD0 | dst.code()); 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD0 | dst.code()); 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::rcr(Register dst, uint8_t imm8) { 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD8 | dst.code()); 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD8 | dst.code()); 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror(const Operand& dst, uint8_t imm8) { 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier emit_operand(ecx, dst); 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier emit_operand(ecx, dst); 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror_cl(const Operand& dst) { 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD3); 985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier emit_operand(ecx, dst); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar(const Operand& dst, uint8_t imm8) { 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, dst); 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, dst); 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar_cl(const Operand& dst) { 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD3); 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, dst); 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sbb(Register dst, const Operand& src) { 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x1B); 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld(Register dst, Register src, uint8_t shift) { 10163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(is_uint5(shift)); 10173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 10183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x0F); 10193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xA4); 10203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(src, Operand(dst)); 10213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(shift); 10223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld_cl(Register dst, Register src) { 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA5); 10283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(src, Operand(dst)); 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl(const Operand& dst, uint8_t imm8) { 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, dst); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, dst); 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl_cl(const Operand& dst) { 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD3); 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, dst); 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr(const Operand& dst, uint8_t imm8) { 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint5(imm8)); // illegal shift count 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm8 == 1) { 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD1); 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebp, dst); 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC1); 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebp, dst); 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr_cl(const Operand& dst) { 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD3); 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebp, dst); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd(Register dst, Register src, uint8_t shift) { 10733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(is_uint5(shift)); 10743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 10753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x0F); 10763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xAC); 10773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(dst, Operand(src)); 10783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(shift); 10793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd_cl(const Operand& dst, Register src) { 10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 10833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x0F); 10843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xAD); 10853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(src, dst); 10863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sub(const Operand& dst, const Immediate& x) { 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(5, dst, x); 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sub(Register dst, const Operand& src) { 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x2B); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sub(const Operand& dst, Register src) { 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x29); 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::test(Register reg, const Immediate& imm) { 11093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (imm.is_uint8()) { 11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch test_b(reg, imm); 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is not using emit_arith because test doesn't support 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sign-extension of 8-bit operands. 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (reg.is(eax)) { 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA9); 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC0 | reg.code()); 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(imm); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::test(Register reg, const Operand& op) { 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x85); 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(reg, op); 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::test_b(Register reg, const Operand& op) { 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(reg.is_byte_register()); 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x84); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(reg, op); 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::test(const Operand& op, const Immediate& imm) { 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op.is_reg_only()) { 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test(op.reg(), imm); 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (imm.is_uint8()) { 11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return test_b(op, imm); 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, op); 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(imm); 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(Register reg, Immediate imm8) { 11573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(imm8.is_uint8()); 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only use test against byte for registers that have a byte 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // variant: eax, ebx, ecx, and edx. 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (reg.is(eax)) { 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA8); 11633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_b(imm8); 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (reg.is_byte_register()) { 11653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_arith_b(0xF6, 0xC0, reg, static_cast<uint8_t>(imm8.x_)); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 11673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC0 | reg.code()); 11703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_w(imm8); 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(const Operand& op, Immediate imm8) { 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op.is_reg_only()) { 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_b(op.reg(), imm8); 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF6); 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, op); 11823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_b(imm8); 11833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 11843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, Immediate imm16) { 11863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(imm16.is_int16() || imm16.is_uint16()); 11873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 11883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (reg.is(eax)) { 11893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xA9); 11903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_w(imm16); 11913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 11923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 11933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xF7); 11943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xc0 | reg.code()); 11953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_w(imm16); 11963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, const Operand& op) { 12003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 12013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 12023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x85); 12033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(reg, op); 12043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 12053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 12063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(const Operand& op, Immediate imm16) { 12073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(imm16.is_int16() || imm16.is_uint16()); 12083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (op.is_reg_only()) { 12093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch test_w(op.reg(), imm16); 12103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return; 12113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 12123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EnsureSpace ensure_space(this); 12133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0x66); 12143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch EMIT(0xF7); 12153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_operand(eax, op); 12163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch emit_w(imm16); 12173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xor_(Register dst, int32_t imm32) { 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(6, Operand(dst), Immediate(imm32)); 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xor_(Register dst, const Operand& src) { 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x33); 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xor_(const Operand& dst, Register src) { 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x31); 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xor_(const Operand& dst, const Immediate& x) { 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_arith(6, dst, x); 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bt(const Operand& dst, Register src) { 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xA3); 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bts(const Operand& dst, Register src) { 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xAB); 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(src, dst); 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bsr(Register dst, const Operand& src) { 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xBD); 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(dst, src); 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bsf(Register dst, const Operand& src) { 1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0x0F); 1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xBC); 1273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(dst, src); 1274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::hlt() { 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF4); 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::int3() { 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xCC); 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::nop() { 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x90); 1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::ret(int imm16) { 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint16(imm16)); 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (imm16 == 0) { 1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC3); 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC2); 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm16 & 0xFF); 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT((imm16 >> 8) & 0xFF); 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::ud2() { 1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0x0F); 1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0x0B); 1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Labels refer to positions in the (to be) generated code. 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// There are bound, linked, and unused labels. 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bound labels refer to known positions in the already 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// generated code. pos() is the position the label refers to. 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Linked labels refer to unknown positions in the code 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to be generated; pos() is the position of the 32bit 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Displacement of the last instruction using the label. 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::print(Label* L) { 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (L->is_unused()) { 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("unused label\n"); 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (L->is_bound()) { 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("bound label to %d\n", L->pos()); 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (L->is_linked()) { 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Label l = *L; 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("unbound label"); 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (l.is_linked()) { 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Displacement disp = disp_at(&l); 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("@ %d ", l.pos()); 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch disp.print(); 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("\n"); 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch disp.next(&l); 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bind_to(Label* L, int pos) { 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (L->is_linked()) { 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Displacement disp = disp_at(L); 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixup_pos = L->pos(); 1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (disp.type() == Displacement::CODE_ABSOLUTE) { 1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch long_at_put(fixup_pos, reinterpret_cast<int>(buffer_ + pos)); 1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch internal_reference_positions_.push_back(fixup_pos); 1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (disp.type() == Displacement::CODE_RELATIVE) { 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Relative to Code* heap object pointer. 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Relative address, relative to point after address. 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch long_at_put(fixup_pos, imm32); 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch disp.next(L); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (L->is_near_linked()) { 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixup_pos = L->near_link_pos(); 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset_to_next = 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(offset_to_next <= 0); 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Relative address, relative to point after address. 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int disp = pos - fixup_pos - sizeof(int8_t); 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(0 <= disp && disp <= 127); 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_byte_at(fixup_pos, disp); 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (offset_to_next < 0) { 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch L->link_to(fixup_pos + offset_to_next, Label::kNear); 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch L->UnuseNear(); 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch L->bind_to(pos); 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bind(Label* L) { 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!L->is_bound()); // label can only be bound once 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bind_to(L, pc_offset()); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::call(Label* L) { 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (L->is_bound()) { 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int long_size = 5; 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offs = L->pos() - pc_offset(); 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(offs <= 0); 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1110 1000 #32-bit disp. 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8); 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(offs - long_size); 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1110 1000 #32-bit disp. 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8); 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_disp(L, Displacement::OTHER); 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) { 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!RelocInfo::IsCodeTarget(rmode)); 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8); 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RelocInfo::IsRuntimeEntry(rmode)) { 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(reinterpret_cast<uint32_t>(entry), rmode); 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(entry - (pc_ + sizeof(int32_t)), rmode); 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Assembler::CallSize(const Operand& adr) { 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Call size is 1 (opcode) + adr.len_ (operand). 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 1 + adr.len_; 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::call(const Operand& adr) { 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edx, adr); 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) { 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 1 /* EMIT */ + sizeof(uint32_t) /* emit */; 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::call(Handle<Code> code, 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RelocInfo::Mode rmode, 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TypeFeedbackId ast_id) { 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(RelocInfo::IsCodeTarget(rmode) 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch || rmode == RelocInfo::CODE_AGE_SEQUENCE); 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8); 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(code, rmode, ast_id); 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::jmp(Label* L, Label::Distance distance) { 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (L->is_bound()) { 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int short_size = 2; 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int long_size = 5; 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offs = L->pos() - pc_offset(); 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(offs <= 0); 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_int8(offs - short_size)) { 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1110 1011 #8-bit disp. 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xEB); 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT((offs - short_size) & 0xFF); 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1110 1001 #32-bit disp. 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(offs - long_size); 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (distance == Label::kNear) { 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xEB); 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_near_disp(L); 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1110 1001 #32-bit disp. 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!RelocInfo::IsCodeTarget(rmode)); 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RelocInfo::IsRuntimeEntry(rmode)) { 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(reinterpret_cast<uint32_t>(entry), rmode); 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(entry - (pc_ + sizeof(int32_t)), rmode); 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::jmp(const Operand& adr) { 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, adr); 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) { 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(RelocInfo::IsCodeTarget(rmode)); 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(code, rmode); 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= cc && static_cast<int>(cc) < 16); 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (L->is_bound()) { 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int short_size = 2; 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int long_size = 6; 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offs = L->pos() - pc_offset(); 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(offs <= 0); 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_int8(offs - short_size)) { 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0111 tttn #8-bit disp 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x70 | cc); 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT((offs - short_size) & 0xFF); 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0000 1111 1000 tttn #32-bit disp 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x80 | cc); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(offs - long_size); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (distance == Label::kNear) { 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x70 | cc); 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_near_disp(L); 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0000 1111 1000 tttn #32-bit disp 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: could eliminate cond. jumps to this jump if condition 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is the same however, seems to be rather unlikely case. 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x80 | cc); 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_disp(L, Displacement::OTHER); 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) { 1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((0 <= cc) && (static_cast<int>(cc) < 16)); 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0000 1111 1000 tttn #32-bit disp. 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x80 | cc); 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RelocInfo::IsRuntimeEntry(rmode)) { 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(reinterpret_cast<uint32_t>(entry), rmode); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(entry - (pc_ + sizeof(int32_t)), rmode); 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::j(Condition cc, Handle<Code> code, RelocInfo::Mode rmode) { 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0000 1111 1000 tttn #32-bit disp 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x80 | cc); 1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit(code, rmode); 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// FPU instructions. 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fld(int i) { 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD9, 0xC0, i); 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fstp(int i) { 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDD, 0xD8, i); 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fld1() { 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8); 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fldpi() { 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xEB); 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fldz() { 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xEE); 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fldln2() { 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xED); 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fld_s(const Operand& adr) { 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, adr); 1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fld_d(const Operand& adr) { 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, adr); 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fstp_s(const Operand& adr) { 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebx, adr); 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fst_s(const Operand& adr) { 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edx, adr); 1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fldcw(const Operand& adr) { 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebp, adr); 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fnstcw(const Operand& adr) { 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, adr); 1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fstp_d(const Operand& adr) { 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebx, adr); 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fst_d(const Operand& adr) { 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edx, adr); 1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fild_s(const Operand& adr) { 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, adr); 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fild_d(const Operand& adr) { 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDF); 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebp, adr); 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fistp_s(const Operand& adr) { 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ebx, adr); 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fisttp_s(const Operand& adr) { 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsEnabled(SSE3)); 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ecx, adr); 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fisttp_d(const Operand& adr) { 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsEnabled(SSE3)); 1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ecx, adr); 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fist_s(const Operand& adr) { 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edx, adr); 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fistp_d(const Operand& adr) { 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDF); 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(edi, adr); 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fabs() { 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE1); 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fchs() { 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE0); 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsqrt() { 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFA); 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fcos() { 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFF); 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsin() { 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFE); 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fptan() { 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF2); 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fyl2x() { 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF1); 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::f2xm1() { 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF0); 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fscale() { 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFD); 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fninit() { 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE3); 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd(int i) { 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDC, 0xC0, i); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd_i(int i) { 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD8, 0xC0, i); 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd_d(const Operand& adr) { 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDC); 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(eax, adr); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsub(int i) { 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDC, 0xE8, i); 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsub_i(int i) { 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD8, 0xE0, i); 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::fsubr_d(const Operand& adr) { 1813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xDC); 1815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(ebp, adr); 1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::fsub_d(const Operand& adr) { 1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xDC); 1822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(esp, adr); 1823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fisub_s(const Operand& adr) { 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDA); 1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, adr); 1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmul_i(int i) { 1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD8, 0xC8, i); 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmul(int i) { 1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDC, 0xC8, i); 1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::fmul_d(const Operand& adr) { 1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xDC); 1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(ecx, adr); 1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdiv(int i) { 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDC, 0xF8, i); 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::fdiv_d(const Operand& adr) { 1859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xDC); 1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(esi, adr); 1862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::fdivr_d(const Operand& adr) { 1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 1867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EMIT(0xDC); 1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_operand(edi, adr); 1869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdiv_i(int i) { 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD8, 0xF0, i); 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::faddp(int i) { 1879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDE, 0xC0, i); 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsubp(int i) { 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDE, 0xE8, i); 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsubrp(int i) { 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDE, 0xE0, i); 1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmulp(int i) { 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDE, 0xC8, i); 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdivp(int i) { 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDE, 0xF8, i); 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fprem() { 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF8); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fprem1() { 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF5); 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fxch(int i) { 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xD9, 0xC8, i); 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fincstp() { 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xF7); 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::ffree(int i) { 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDD, 0xC0, i); 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::ftst() { 1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE4); 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fxam() { 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE5); 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fucomp(int i) { 1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_farith(0xDD, 0xE8, i); 1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fucompp() { 1962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDA); 1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fucomi(int i) { 1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE8 + i); 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fucomip() { 1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDF); 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE9); 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fcompp() { 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDE); 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fnstsw_ax() { 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDF); 1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE0); 1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fwait() { 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x9B); 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::frndint() { 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xD9); 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xFC); 2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fnclex() { 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDB); 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xE2); 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fnsave(const Operand& adr) { 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esi, adr); 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::frstor(const Operand& adr) { 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xDD); 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(esp, adr); 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sahf() { 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x9E); 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::setcc(Condition cc, Register reg) { 2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(reg.is_byte_register()); 2038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x0F); 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x90 | cc); 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0xC0 | reg.code()); 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::GrowBuffer() { 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(buffer_overflow()); 2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!own_buffer_) FATAL("external code buffer is too small"); 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compute new buffer size. 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeDesc desc; // the new buffer 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc.buffer_size = 2 * buffer_size_; 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Some internal data structures overflow for very large buffers, 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // they must ensure that kMaximalBufferSize is not too large. 2055c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (desc.buffer_size > kMaximalBufferSize || 2056c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static_cast<size_t>(desc.buffer_size) > 2057c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch isolate()->heap()->MaxOldGenerationSize()) { 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set up new buffer. 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc.buffer = NewArray<byte>(desc.buffer_size); 2063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch desc.origin = this; 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc.instr_size = pc_offset(); 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos()); 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the buffer in debug mode. Use 'int3' instructions to make 2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sure to get into problems if we ever run uninitialized code. 2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(desc.buffer, 0xCC, desc.buffer_size); 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the data. 2074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pc_delta = desc.buffer - buffer_; 2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 2076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemMove(desc.buffer, buffer_, desc.instr_size); 2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(), 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch desc.reloc_size); 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(buffer_); 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer_ = desc.buffer; 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer_size_ = desc.buffer_size; 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pc_ += pc_delta; 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reloc_info_writer.last_pc() + pc_delta); 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Relocate internal references. 2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (auto pos : internal_reference_positions_) { 2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t* p = reinterpret_cast<int32_t*>(buffer_ + pos); 2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *p += pc_delta; 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!buffer_overflow()); 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode 2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint8(imm8)); 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((op1 & 0x01) == 0); // should be 8bit operation 2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(op1); 2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(op2 | dst.code()); 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(imm8); 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((0 <= sel) && (sel <= 7)); 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register ireg = { sel }; 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (x.is_int8()) { 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x83); // using a sign-extended 8-bit immediate. 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ireg, dst); 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(x.x_ & 0xFF); 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (dst.is_reg(eax)) { 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT((sel << 3) | 0x05); // short form if the destination is eax. 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(x); 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(0x81); // using a literal 32-bit immediate. 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit_operand(ireg, dst); 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(x); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_operand(Register reg, const Operand& adr) { 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const unsigned length = adr.len_; 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(length > 0); 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Emit updated ModRM byte containing the given register. 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Emit the rest of the encoded operand. 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pc_ += length; 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Emit relocation information if necessary. 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) { 2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RecordRelocInfo(adr.rmode_); 2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (adr.rmode_ == RelocInfo::INTERNAL_REFERENCE) { // Fixup for labels 2141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_label(*reinterpret_cast<Label**>(pc_)); 2142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pc_ += sizeof(int32_t); 2144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_label(Label* label) { 2150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (label->is_bound()) { 2151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch internal_reference_positions_.push_back(pc_offset()); 2152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit(reinterpret_cast<uint32_t>(buffer_ + label->pos())); 2153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_disp(label, Displacement::CODE_ABSOLUTE); 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_farith(int b1, int b2, int i) { 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= i && i < 8); // illegal stack offset 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(b1); 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(b2 + i); 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::db(uint8_t data) { 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EMIT(data); 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::dd(uint32_t data) { 2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EnsureSpace ensure_space(this); 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch emit(data); 2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dq(uint64_t data) { 2180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_q(data); 2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dd(Label* label) { 2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpace ensure_space(this); 2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE); 2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_label(label); 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!RelocInfo::IsNone(rmode)); 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Don't record external references unless the heap will be serialized. 2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (rmode == RelocInfo::EXTERNAL_REFERENCE && 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !serializer_enabled() && !emit_debug_code()) { 2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo rinfo(isolate(), pc_, rmode, data, NULL); 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reloc_info_writer.Write(&rinfo); 2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_TARGET_ARCH_X87 2207