1864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Copyright (c) 1994-2006 Sun Microsystems Inc. 2864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// All Rights Reserved. 3864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 4864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 5864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// modification, are permitted provided that the following conditions 6864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// are met: 7864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 8864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// - Redistributions of source code must retain the above copyright notice, 9864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// this list of conditions and the following disclaimer. 10864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 11864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// - Redistribution in binary form must reproduce the above copyright 12864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// notice, this list of conditions and the following disclaimer in the 13864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// documentation and/or other materials provided with the 14864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// distribution. 15864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 16864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// - Neither the name of Sun Microsystems or the names of contributors may 17864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// be used to endorse or promote products derived from this software without 18864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// specific prior written permission. 19864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 20864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// OF THE POSSIBILITY OF SUCH DAMAGE. 32864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 33864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// The original source code covered by the above license above has been modified 34864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// significantly by Google Inc. 35864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 36864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 38864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 39864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#if V8_TARGET_ARCH_X87 40864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 419aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org#include "src/base/bits.h" 425de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/cpu.h" 43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disassembler.h" 44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 45196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 46864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 47864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgnamespace v8 { 48864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgnamespace internal { 49864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 50864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ----------------------------------------------------------------------------- 51864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Implementation of CpuFeatures 52864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 53864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid CpuFeatures::ProbeImpl(bool cross_compile) { 545de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::CPU cpu; 55864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 56864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Only use statically determined features for cross compile (snapshot). 57864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (cross_compile) return; 58864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 59864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 60864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 61864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid CpuFeatures::PrintTarget() { } 62864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid CpuFeatures::PrintFeatures() { } 63864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 64864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 65864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ----------------------------------------------------------------------------- 66864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Implementation of Displacement 67864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 68864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Displacement::init(Label* L, Type type) { 69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!L->is_bound()); 70864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int next = 0; 71864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (L->is_linked()) { 72864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org next = L->pos(); 73e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(next > 0); // Displacements must be at positions > 0 74864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 75864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Ensure that we _never_ overflow the next field. 76e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(NextField::is_valid(Assembler::kMaximalBufferSize)); 77864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org data_ = NextField::encode(next) | TypeField::encode(type); 78864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 79864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 80864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 81864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ----------------------------------------------------------------------------- 82864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Implementation of RelocInfo 83864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 84864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 85864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgconst int RelocInfo::kApplyMask = 86864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 87864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE | 88864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1 << RelocInfo::DEBUG_BREAK_SLOT | 1 << RelocInfo::CODE_AGE_SEQUENCE; 89864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 90864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 91864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgbool RelocInfo::IsCodedSpecially() { 92864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // The deserializer needs to know whether a pointer is specially coded. Being 93864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // specially coded on IA32 means that it is a relative address, as used by 94864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // branch instructions. These are also the ones that need changing when a 95864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // code object moves. 96864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return (1 << rmode_) & kApplyMask; 97864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 98864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 99864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgbool RelocInfo::IsInConstantPool() { 101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return false; 102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid RelocInfo::PatchCode(byte* instructions, int instruction_count) { 106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Patch the code at the current address with the supplied instructions. 107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (int i = 0; i < instruction_count; i++) { 108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org *(pc_ + i) = *(instructions + i); 109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Indicate that code has changed. 1125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CpuFeatures::FlushICache(pc_, instruction_count); 113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Patch the code at the current PC with a call to the target address. 117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Additional guard int3 instructions can be added if required. 118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) { 119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Call instruction takes up 5 bytes and int3 takes up one byte. 120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org static const int kCallCodeSize = 5; 121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int code_size = kCallCodeSize + guard_bytes; 122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Create a code patcher. 124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodePatcher patcher(pc_, code_size); 125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Add a label for checking the size of the code used for returning. 127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef DEBUG 128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label check_codesize; 129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org patcher.masm()->bind(&check_codesize); 130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Patch the code. 133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org patcher.masm()->call(target, RelocInfo::NONE32); 134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Check that the size of the code generated is as expected. 136e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(kCallCodeSize, 137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize)); 138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Add the requested number of int3 instructions after the call. 140e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_GE(guard_bytes, 0); 141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (int i = 0; i < guard_bytes; i++) { 142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org patcher.masm()->int3(); 143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ----------------------------------------------------------------------------- 148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Implementation of Operand 149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) { 151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + disp/r] 152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base] 154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(0, base); 155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (base.is(esp)) set_sib(times_1, esp, base); 156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + disp8] 158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(1, base); 159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (base.is(esp)) set_sib(times_1, esp, base); 160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_disp8(disp); 161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + disp/r] 163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(2, base); 164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (base.is(esp)) set_sib(times_1, esp, base); 165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_dispr(disp, rmode); 166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgOperand::Operand(Register base, 171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Register index, 172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org ScaleFactor scale, 173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int32_t disp, 174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo::Mode rmode) { 175e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(esp)); // illegal addressing mode 176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + index*scale + disp/r] 177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) { 178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + index*scale] 179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(0, esp); 180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_sib(scale, index, base); 181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) { 182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + index*scale + disp8] 183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(1, esp); 184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_sib(scale, index, base); 185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_disp8(disp); 186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [base + index*scale + disp/r] 188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(2, esp); 189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_sib(scale, index, base); 190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_dispr(disp, rmode); 191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 193864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgOperand::Operand(Register index, 196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org ScaleFactor scale, 197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int32_t disp, 198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo::Mode rmode) { 199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!index.is(esp)); // illegal addressing mode 200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // [index*scale + disp/r] 201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_modrm(0, esp); 202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_sib(scale, index, ebp); 203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_dispr(disp, rmode); 204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgbool Operand::is_reg(Register reg) const { 208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return ((buf_[0] & 0xF8) == 0xC0) // addressing mode is register only. 209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org && ((buf_[0] & 0x07) == reg.code()); // register codes match. 210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgbool Operand::is_reg_only() const { 214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return (buf_[0] & 0xF8) == 0xC0; // Addressing mode is register only. 215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgRegister Operand::reg() const { 219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_reg_only()); 220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return Register::from_code(buf_[0] & 0x07); 221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 224864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// ----------------------------------------------------------------------------- 225864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Implementation of Assembler. 226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Emit a single byte. Must always be inlined. 228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define EMIT(x) \ 229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org *pc_++ = (x) 230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 232864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef GENERATED_CODE_COVERAGE 233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgstatic void InitCoverageLog(); 234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org : AssemblerBase(isolate, buffer, buffer_size), 238864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder_(this) { 239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Clear the buffer in debug mode unless it was provided by the 240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // caller in which case we can't be sure it's okay to overwrite 241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // existing code in it; see CodePatcher::CodePatcher(...). 242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef DEBUG 243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (own_buffer_) { 244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org memset(buffer_, 0xCC, buffer_size_); // int3 245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 247864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef GENERATED_CODE_COVERAGE 251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org InitCoverageLog(); 252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::GetCode(CodeDesc* desc) { 257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Finalize code (at this point overflow() may be true, but the gap ensures 258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // that we are still not overlapping instructions and relocation info). 259e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pc_ <= reloc_info_writer.pos()); // No overlap. 260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Set up code descriptor. 261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc->buffer = buffer_; 262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc->buffer_size = buffer_size_; 263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc->instr_size = pc_offset(); 264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc->origin = this; 266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::Align(int m) { 2709aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(base::bits::IsPowerOfTwo32(m)); 271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int mask = m - 1; 272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int addr = pc_offset(); 273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Nop((m - (addr & mask)) & mask); 274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 276864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgbool Assembler::IsNop(Address addr) { 278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Address a = addr; 279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org while (*a == 0x66) a++; 280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (*a == 0x90) return true; 281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (a[0] == 0xf && a[1] == 0x1f) return true; 282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return false; 283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::Nop(int bytes) { 287864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Older CPUs that do not support SSE2 may not support multibyte NOP 290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // instructions. 291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (; bytes > 0; bytes--) { 292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x90); 293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::CodeTargetAlign() { 299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Align(16); // Preferred alignment of jump targets on ia32. 300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 302864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cpuid() { 304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA2); 307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::pushad() { 311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x60); 313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 316864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::popad() { 317864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 318864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x61); 319864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 320864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 321864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 322864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::pushfd() { 323864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 324864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x9C); 325864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 326864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 327864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 328864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::popfd() { 329864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 330864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x9D); 331864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 332864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 333864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 334864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::push(const Immediate& x) { 335864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 336864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (x.is_int8()) { 337864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x6a); 338864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(x.x_); 339864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 340864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x68); 341864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(x); 342864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 343864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 344864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 345864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 346864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::push_imm32(int32_t imm32) { 347864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 348864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x68); 349864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm32); 350864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 351864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 352864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 353864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::push(Register src) { 354864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 355864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x50 | src.code()); 356864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 357864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 358864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 359864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::push(const Operand& src) { 360864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 361864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 362864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(esi, src); 363864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 364864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 365864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 366864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::pop(Register dst) { 367e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reloc_info_writer.last_pc() != NULL); 368864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 369864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x58 | dst.code()); 370864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 371864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 372864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 373864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::pop(const Operand& dst) { 374864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 375864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x8F); 376864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 377864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 378864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 379864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 380864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::enter(const Immediate& size) { 381864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 382864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC8); 383864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_w(size); 384864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0); 385864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 386864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 387864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 388864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::leave() { 389864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 390864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC9); 391864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 392864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 393864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 394864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_b(Register dst, const Operand& src) { 395864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(dst.is_byte_register()); 396864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 397864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x8A); 398864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 399864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 400864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 401864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 402864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_b(const Operand& dst, int8_t imm8) { 403864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 404864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC6); 405864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 406864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 407864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 408864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 409864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 410864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_b(const Operand& dst, Register src) { 411864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(src.is_byte_register()); 412864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 413864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x88); 414864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 415864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 416864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 417864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 418864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_w(Register dst, const Operand& src) { 419864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 420864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x66); 421864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x8B); 422864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 423864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 424864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 425864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 426864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_w(const Operand& dst, Register src) { 427864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 428864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x66); 429864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x89); 430864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 431864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 432864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 433864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 434864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov_w(const Operand& dst, int16_t imm16) { 435864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 436864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x66); 437864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC7); 438864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 439864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(static_cast<int8_t>(imm16 & 0xff)); 440864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(static_cast<int8_t>(imm16 >> 8)); 441864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 442864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 443864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 444864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(Register dst, int32_t imm32) { 445864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 446864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xB8 | dst.code()); 447864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm32); 448864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 449864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 450864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 451864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(Register dst, const Immediate& x) { 452864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 453864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xB8 | dst.code()); 454864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(x); 455864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 456864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 457864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 458864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(Register dst, Handle<Object> handle) { 459864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 460864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xB8 | dst.code()); 461864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(handle); 462864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 463864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 464864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 465864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(Register dst, const Operand& src) { 466864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 467864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x8B); 468864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 469864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 470864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 471864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 472864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(Register dst, Register src) { 473864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 474864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x89); 475864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC0 | src.code() << 3 | dst.code()); 476864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 477864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 478864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 479864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(const Operand& dst, const Immediate& x) { 480864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 481864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC7); 482864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 483864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(x); 484864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 485864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 486864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 487864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(const Operand& dst, Handle<Object> handle) { 488864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 489864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC7); 490864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 491864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(handle); 492864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 493864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 494864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 495864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mov(const Operand& dst, Register src) { 496864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 497864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x89); 498864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 499864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 500864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 501864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 502864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::movsx_b(Register dst, const Operand& src) { 503864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 504864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 505864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xBE); 506864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 507864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 508864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 509864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 510864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::movsx_w(Register dst, const Operand& src) { 511864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 512864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 513864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xBF); 514864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 515864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 516864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 517864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 518864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::movzx_b(Register dst, const Operand& src) { 519864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 520864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 521864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xB6); 522864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 523864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 524864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 525864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 526864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::movzx_w(Register dst, const Operand& src) { 527864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 528864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 529864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xB7); 530864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 531864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 532864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 533864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 534864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cld() { 535864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 536864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFC); 537864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 538864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 539864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 540864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::rep_movs() { 541864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 542864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF3); 543864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA5); 544864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 545864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 546864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 547864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::rep_stos() { 548864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 549864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF3); 550864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xAB); 551864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 552864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 553864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 554864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::stos() { 555864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 556864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xAB); 557864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 558864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 559864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 560864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::xchg(Register dst, Register src) { 561864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 562864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (src.is(eax) || dst.is(eax)) { // Single-byte encoding. 563864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x90 | (src.is(eax) ? dst.code() : src.code())); 564864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 565864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x87); 566864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC0 | src.code() << 3 | dst.code()); 567864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 568864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 569864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 570864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 5715c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::xchg(Register dst, const Operand& src) { 5725c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EnsureSpace ensure_space(this); 5735c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EMIT(0x87); 5745c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(dst, src); 5755c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org} 5765c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 5775c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 578864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::adc(Register dst, int32_t imm32) { 579864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 580864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(2, Operand(dst), Immediate(imm32)); 581864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 582864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 583864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 584864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::adc(Register dst, const Operand& src) { 585864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 586864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x13); 587864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 588864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 589864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 590864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 591864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::add(Register dst, const Operand& src) { 592864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 593864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x03); 594864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 595864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 596864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 597864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 598864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::add(const Operand& dst, Register src) { 599864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 600864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x01); 601864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 602864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 603864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 604864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 605864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::add(const Operand& dst, const Immediate& x) { 606e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reloc_info_writer.last_pc() != NULL); 607864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 608864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(0, dst, x); 609864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 610864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 611864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 612864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::and_(Register dst, int32_t imm32) { 613864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org and_(dst, Immediate(imm32)); 614864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 615864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 616864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 617864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::and_(Register dst, const Immediate& x) { 618864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 619864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(4, Operand(dst), x); 620864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 621864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 622864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 623864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::and_(Register dst, const Operand& src) { 624864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 625864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x23); 626864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 627864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 628864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 629864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 630864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::and_(const Operand& dst, const Immediate& x) { 631864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 632864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(4, dst, x); 633864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 634864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 635864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 636864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::and_(const Operand& dst, Register src) { 637864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 638864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x21); 639864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 640864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 641864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 642864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 643864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpb(const Operand& op, int8_t imm8) { 644864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 645864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (op.is_reg(eax)) { 646864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x3C); 647864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 648864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x80); 649864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edi, op); // edi == 7 650864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 651864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 652864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 653864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 654864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 655864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpb(const Operand& op, Register reg) { 656864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(reg.is_byte_register()); 657864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 658864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x38); 659864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(reg, op); 660864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 661864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 662864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 663864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpb(Register reg, const Operand& op) { 664864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(reg.is_byte_register()); 665864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 666864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x3A); 667864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(reg, op); 668864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 669864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 670864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 671864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpw(const Operand& op, Immediate imm16) { 672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(imm16.is_int16()); 673864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 674864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x66); 675864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x81); 676864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edi, op); 677864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_w(imm16); 678864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 679864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 680864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 681864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmp(Register reg, int32_t imm32) { 682864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 683864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(7, Operand(reg), Immediate(imm32)); 684864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 685864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 686864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 687864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmp(Register reg, Handle<Object> handle) { 688864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 689864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(7, Operand(reg), Immediate(handle)); 690864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 691864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 692864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 693864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmp(Register reg, const Operand& op) { 694864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 695864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x3B); 696864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(reg, op); 697864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 698864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 699864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 700864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmp(const Operand& op, const Immediate& imm) { 701864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 702864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(7, op, imm); 703864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 704864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 705864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 706864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmp(const Operand& op, Handle<Object> handle) { 707864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 708864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(7, op, Immediate(handle)); 709864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 710864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 711864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 712864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpb_al(const Operand& op) { 713864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 714864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x38); // CMP r/m8, r8 715864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, op); // eax has same code as register al. 716864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 717864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 718864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 719864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cmpw_ax(const Operand& op) { 720864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 721864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x66); 722864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x39); // CMP r/m16, r16 723864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, op); // eax has same code as register ax. 724864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 725864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 726864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 727864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::dec_b(Register dst) { 728864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(dst.is_byte_register()); 729864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 730864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFE); 731864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC8 | dst.code()); 732864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 733864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 734864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 735864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::dec_b(const Operand& dst) { 736864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 737864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFE); 738864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ecx, dst); 739864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 740864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 741864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 742864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::dec(Register dst) { 743864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 744864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x48 | dst.code()); 745864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 746864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 747864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 748864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::dec(const Operand& dst) { 749864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 750864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 751864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ecx, dst); 752864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 753864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 754864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 755864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::cdq() { 756864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 757864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x99); 758864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 759864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 760864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 7615c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::idiv(const Operand& src) { 7625c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EnsureSpace ensure_space(this); 7635c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EMIT(0xF7); 7645c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(edi, src); 7655c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org} 7665c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 7675c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 7685c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::div(const Operand& src) { 769864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 770864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 7715c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(esi, src); 772864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 773864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 774864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 775864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::imul(Register reg) { 776864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 777864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 778864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8 | reg.code()); 779864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 780864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 781864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 782864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::imul(Register dst, const Operand& src) { 783864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 784864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 785864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xAF); 786864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 787864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 788864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 789864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 790864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::imul(Register dst, Register src, int32_t imm32) { 7915c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org imul(dst, Operand(src), imm32); 7925c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org} 7935c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 7945c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 7955c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) { 796864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 797864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (is_int8(imm32)) { 798864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x6B); 7995c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(dst, src); 800864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm32); 801864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 802864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x69); 8035c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(dst, src); 804864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm32); 805864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 806864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 807864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 808864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 809864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::inc(Register dst) { 810864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 811864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x40 | dst.code()); 812864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 813864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 814864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 815864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::inc(const Operand& dst) { 816864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 817864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 818864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, dst); 819864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 820864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 821864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 822864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::lea(Register dst, const Operand& src) { 823864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 824864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x8D); 825864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 826864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 827864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 828864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 829864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::mul(Register src) { 830864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 831864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 832864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE0 | src.code()); 833864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 834864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 835864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 836864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::neg(Register dst) { 837864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 838864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 839864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD8 | dst.code()); 840864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 841864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 842864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 8435c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::neg(const Operand& dst) { 8445c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EnsureSpace ensure_space(this); 8455c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EMIT(0xF7); 8465c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(ebx, dst); 8475c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org} 8485c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 8495c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 850864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::not_(Register dst) { 851864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 852864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 853864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD0 | dst.code()); 854864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 855864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 856864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 8575c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::not_(const Operand& dst) { 8585c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EnsureSpace ensure_space(this); 8595c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org EMIT(0xF7); 8605c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(edx, dst); 8615c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org} 8625c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 8635c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org 864864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::or_(Register dst, int32_t imm32) { 865864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 866864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(1, Operand(dst), Immediate(imm32)); 867864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 868864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 869864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 870864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::or_(Register dst, const Operand& src) { 871864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 872864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0B); 873864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 874864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 875864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 876864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 877864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::or_(const Operand& dst, const Immediate& x) { 878864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 879864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(1, dst, x); 880864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 881864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 882864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 883864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::or_(const Operand& dst, Register src) { 884864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 885864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x09); 886864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 887864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 888864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 889864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 890864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::rcl(Register dst, uint8_t imm8) { 891864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 893864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 894864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 895864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD0 | dst.code()); 896864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 897864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 898864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD0 | dst.code()); 899864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 900864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 901864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 902864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 903864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 904864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::rcr(Register dst, uint8_t imm8) { 905864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 906e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 907864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 908864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 909864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD8 | dst.code()); 910864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 911864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 912864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD8 | dst.code()); 913864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 914864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 915864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 916864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 917864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 918864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::ror(Register dst, uint8_t imm8) { 919864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 920e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 921864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 922864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 923864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC8 | dst.code()); 924864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 925864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 926864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC8 | dst.code()); 927864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 928864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 929864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 930864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 931864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 932864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::ror_cl(Register dst) { 933864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 934864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD3); 935864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC8 | dst.code()); 936864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 937864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 938864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 9395c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::sar(const Operand& dst, uint8_t imm8) { 940864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 941e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 942864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 943864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 9445c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(edi, dst); 945864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 946864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 9475c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(edi, dst); 948864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 949864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 950864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 951864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 952864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 9535c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::sar_cl(const Operand& dst) { 954864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 955864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD3); 9565c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(edi, dst); 957864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 958864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 959864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 960864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::sbb(Register dst, const Operand& src) { 961864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 962864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x1B); 963864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 964864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 965864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 966864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 967864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::shld(Register dst, const Operand& src) { 968864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 969864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 970864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA5); 971864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 972864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 973864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 974864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 9755c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::shl(const Operand& dst, uint8_t imm8) { 976864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 977e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 978864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 979864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 9805c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(esp, dst); 981864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 982864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 9835c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(esp, dst); 984864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 985864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 986864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 987864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 988864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 9895c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::shl_cl(const Operand& dst) { 990864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 991864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD3); 9925c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(esp, dst); 993864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 994864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 995864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 996864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::shrd(Register dst, const Operand& src) { 997864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 998864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 999864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xAD); 1000864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 1001864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1002864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1003864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 10045c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::shr(const Operand& dst, uint8_t imm8) { 1005864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1006e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint5(imm8)); // illegal shift count 1007864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm8 == 1) { 1008864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD1); 10095c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(ebp, dst); 1010864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1011864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC1); 10125c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(ebp, dst); 1013864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 1014864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1015864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1016864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1017864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 10185c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.orgvoid Assembler::shr_cl(const Operand& dst) { 1019864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1020864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD3); 10215c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org emit_operand(ebp, dst); 1022864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1023864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1024864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1025864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::sub(const Operand& dst, const Immediate& x) { 1026864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1027864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(5, dst, x); 1028864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1029864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1030864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1031864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::sub(Register dst, const Operand& src) { 1032864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1033864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x2B); 1034864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 1035864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1036864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1037864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1038864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::sub(const Operand& dst, Register src) { 1039864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1040864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x29); 1041864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 1042864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1043864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1044864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1045864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test(Register reg, const Immediate& imm) { 1046864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { 1047864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org test_b(reg, imm.x_); 1048864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 1049864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1050864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1051864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1052864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // This is not using emit_arith because test doesn't support 1053864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // sign-extension of 8-bit operands. 1054864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (reg.is(eax)) { 1055864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA9); 1056864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1057864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 1058864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC0 | reg.code()); 1059864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1060864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm); 1061864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1062864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1063864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1064864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test(Register reg, const Operand& op) { 1065864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1066864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x85); 1067864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(reg, op); 1068864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1069864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1070864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1071864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test_b(Register reg, const Operand& op) { 1072864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(reg.is_byte_register()); 1073864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1074864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x84); 1075864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(reg, op); 1076864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1077864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1078864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1079864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test(const Operand& op, const Immediate& imm) { 1080864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (op.is_reg_only()) { 1081864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org test(op.reg(), imm); 1082864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 1083864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1084864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) { 1085864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return test_b(op, imm.x_); 1086864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1087864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1088864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 1089864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, op); 1090864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm); 1091864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1092864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1093864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1094864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test_b(Register reg, uint8_t imm8) { 1095864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1096864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Only use test against byte for registers that have a byte 1097864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // variant: eax, ebx, ecx, and edx. 1098864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (reg.is(eax)) { 1099864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA8); 1100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 1101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (reg.is_byte_register()) { 1102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith_b(0xF6, 0xC0, reg, imm8); 1103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 1105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC0 | reg.code()); 1106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(imm8); 1107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::test_b(const Operand& op, uint8_t imm8) { 1112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (op.is_reg_only()) { 1113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org test_b(op.reg(), imm8); 1114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 1115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF6); 1118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, op); 1119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 1120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::xor_(Register dst, int32_t imm32) { 1124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(6, Operand(dst), Immediate(imm32)); 1126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::xor_(Register dst, const Operand& src) { 1130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x33); 1132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 1133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::xor_(const Operand& dst, Register src) { 1137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x31); 1139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 1140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::xor_(const Operand& dst, const Immediate& x) { 1144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_arith(6, dst, x); 1146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::bt(const Operand& dst, Register src) { 1150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xA3); 1153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 1154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::bts(const Operand& dst, Register src) { 1158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xAB); 1161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(src, dst); 1162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::bsr(Register dst, const Operand& src) { 1166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xBD); 1169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(dst, src); 1170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::hlt() { 1174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1175864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF4); 1176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::int3() { 1180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xCC); 1182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::nop() { 1186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x90); 1188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::ret(int imm16) { 1192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1193e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint16(imm16)); 1194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (imm16 == 0) { 1195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC3); 1196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC2); 1198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm16 & 0xFF); 1199864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT((imm16 >> 8) & 0xFF); 1200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Labels refer to positions in the (to be) generated code. 1205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// There are bound, linked, and unused labels. 1206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 1207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Bound labels refer to known positions in the already 1208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// generated code. pos() is the position the label refers to. 1209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// 1210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Linked labels refer to unknown positions in the code 1211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// to be generated; pos() is the position of the 32bit 1212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Displacement of the last instruction using the label. 1213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::print(Label* L) { 1216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (L->is_unused()) { 1217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("unused label\n"); 1218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (L->is_bound()) { 1219864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("bound label to %d\n", L->pos()); 1220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (L->is_linked()) { 1221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Label l = *L; 1222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("unbound label"); 1223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org while (l.is_linked()) { 1224864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Displacement disp = disp_at(&l); 1225864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("@ %d ", l.pos()); 1226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org disp.print(); 1227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("\n"); 1228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org disp.next(&l); 1229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org PrintF("label in inconsistent state (pos = %d)\n", L->pos_); 1232864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::bind_to(Label* L, int pos) { 1237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1238e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position 1239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org while (L->is_linked()) { 1240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Displacement disp = disp_at(L); 1241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int fixup_pos = L->pos(); 1242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (disp.type() == Displacement::CODE_RELATIVE) { 1243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Relative to Code* heap object pointer. 1244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag); 1245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (disp.type() == Displacement::UNCONDITIONAL_JUMP) { 1247e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(byte_at(fixup_pos - 1) == 0xE9); // jmp expected 1248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Relative address, relative to point after address. 1250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int imm32 = pos - (fixup_pos + sizeof(int32_t)); 1251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org long_at_put(fixup_pos, imm32); 1252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org disp.next(L); 1254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org while (L->is_near_linked()) { 1256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int fixup_pos = L->near_link_pos(); 1257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int offset_to_next = 1258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos))); 1259e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offset_to_next <= 0); 1260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Relative address, relative to point after address. 1261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int disp = pos - fixup_pos - sizeof(int8_t); 1262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CHECK(0 <= disp && disp <= 127); 1263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org set_byte_at(fixup_pos, disp); 1264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (offset_to_next < 0) { 1265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org L->link_to(fixup_pos + offset_to_next, Label::kNear); 1266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org L->UnuseNear(); 1268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1270864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org L->bind_to(pos); 1271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::bind(Label* L) { 1275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!L->is_bound()); // label can only be bound once 1277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org bind_to(L, pc_offset()); 1278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::call(Label* L) { 1282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (L->is_bound()) { 1285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const int long_size = 5; 1286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int offs = L->pos() - pc_offset(); 1287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 1288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 1110 1000 #32-bit disp. 1289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8); 1290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(offs - long_size); 1291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 1110 1000 #32-bit disp. 1293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8); 1294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_disp(L, Displacement::OTHER); 1295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) { 1300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1302e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsCodeTarget(rmode)); 1303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8); 1304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 1305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 1306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 1308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgint Assembler::CallSize(const Operand& adr) { 1313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Call size is 1 (opcode) + adr.len_ (operand). 1314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return 1 + adr.len_; 1315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1316864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1317864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1318864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::call(const Operand& adr) { 1319864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1320864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1321864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 1322864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edx, adr); 1323864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1324864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1325864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1326864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) { 1327864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return 1 /* EMIT */ + sizeof(uint32_t) /* emit */; 1328864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1329864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1330864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1331864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::call(Handle<Code> code, 1332864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo::Mode rmode, 1333864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org TypeFeedbackId ast_id) { 1334864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1335864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1336e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsCodeTarget(rmode) 1337864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org || rmode == RelocInfo::CODE_AGE_SEQUENCE); 1338864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8); 1339864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(code, rmode, ast_id); 1340864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1341864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1342864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1343864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::jmp(Label* L, Label::Distance distance) { 1344864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1345864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (L->is_bound()) { 1346864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const int short_size = 2; 1347864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const int long_size = 5; 1348864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int offs = L->pos() - pc_offset(); 1349e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 1350864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (is_int8(offs - short_size)) { 1351864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 1110 1011 #8-bit disp. 1352864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xEB); 1353864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT((offs - short_size) & 0xFF); 1354864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1355864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 1110 1001 #32-bit disp. 1356864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1357864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(offs - long_size); 1358864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1359864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (distance == Label::kNear) { 1360864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xEB); 1361864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_near_disp(L); 1362864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1363864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 1110 1001 #32-bit disp. 1364864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1365864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1366864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1367864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1368864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1369864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1370864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { 1371864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1372e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsCodeTarget(rmode)); 1373864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1374864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 1375864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 1376864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1377864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 1378864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1379864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1380864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1381864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1382864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::jmp(const Operand& adr) { 1383864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1384864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 1385864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(esp, adr); 1386864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1387864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1388864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1389864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) { 1390864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1391e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(RelocInfo::IsCodeTarget(rmode)); 1392864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1393864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(code, rmode); 1394864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1395864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1396864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1397864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) { 1398864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1399e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= cc && static_cast<int>(cc) < 16); 1400864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (L->is_bound()) { 1401864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const int short_size = 2; 1402864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const int long_size = 6; 1403864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int offs = L->pos() - pc_offset(); 1404e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(offs <= 0); 1405864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (is_int8(offs - short_size)) { 1406864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 0111 tttn #8-bit disp 1407864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x70 | cc); 1408864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT((offs - short_size) & 0xFF); 1409864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1410864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 0000 1111 1000 tttn #32-bit disp 1411864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1412864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x80 | cc); 1413864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(offs - long_size); 1414864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1415864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (distance == Label::kNear) { 1416864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x70 | cc); 1417864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_near_disp(L); 1418864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1419864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 0000 1111 1000 tttn #32-bit disp 1420864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Note: could eliminate cond. jumps to this jump if condition 1421864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // is the same however, seems to be rather unlikely case. 1422864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1423864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x80 | cc); 1424864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_disp(L, Displacement::OTHER); 1425864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1426864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1427864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1428864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1429864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) { 1430864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((0 <= cc) && (static_cast<int>(cc) < 16)); 1432864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 0000 1111 1000 tttn #32-bit disp. 1433864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1434864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x80 | cc); 1435864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (RelocInfo::IsRuntimeEntry(rmode)) { 1436864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(reinterpret_cast<uint32_t>(entry), rmode); 1437864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 1438864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(entry - (pc_ + sizeof(int32_t)), rmode); 1439864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1440864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1441864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1442864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1443864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::j(Condition cc, Handle<Code> code) { 1444864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1445864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // 0000 1111 1000 tttn #32-bit disp 1446864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1447864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x80 | cc); 1448864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(code, RelocInfo::CODE_TARGET); 1449864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1450864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1451864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1452864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// FPU instructions. 1453864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1454864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fld(int i) { 1455864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1456864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD9, 0xC0, i); 1457864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1458864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1459864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1460864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fstp(int i) { 1461864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1462864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDD, 0xD8, i); 1463864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1464864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1465864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1466864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fld1() { 1467864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1468864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1469864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8); 1470864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1471864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1472864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1473864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fldpi() { 1474864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1475864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1476864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xEB); 1477864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1478864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1479864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1480864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fldz() { 1481864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1482864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1483864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xEE); 1484864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1485864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1486864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1487864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fldln2() { 1488864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1489864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1490864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xED); 1491864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1492864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1493864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1494864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fld_s(const Operand& adr) { 1495864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1496864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1497864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, adr); 1498864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1499864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1500864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1501864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fld_d(const Operand& adr) { 1502864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1503864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDD); 1504864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, adr); 1505864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1506864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1507864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1508864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fstp_s(const Operand& adr) { 1509864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1510864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1511864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ebx, adr); 1512864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1513864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1514864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1515864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fst_s(const Operand& adr) { 1516864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1517864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1518864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edx, adr); 1519864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1520864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1521864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 152206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fldcw(const Operand& adr) { 152306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 152406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xD9); 152506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org emit_operand(ebp, adr); 152606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 152706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 152806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 152906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fnstcw(const Operand& adr) { 153006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 153106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xD9); 153206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org emit_operand(edi, adr); 153306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 153406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 153506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 1536864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fstp_d(const Operand& adr) { 1537864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1538864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDD); 1539864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ebx, adr); 1540864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1541864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1542864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1543864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fst_d(const Operand& adr) { 1544864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1545864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDD); 1546864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edx, adr); 1547864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1548864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1549864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1550864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fild_s(const Operand& adr) { 1551864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1552864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1553864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(eax, adr); 1554864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1555864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1556864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1557864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fild_d(const Operand& adr) { 1558864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1559864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDF); 1560864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ebp, adr); 1561864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1562864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1563864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1564864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fistp_s(const Operand& adr) { 1565864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1566864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1567864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ebx, adr); 1568864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1569864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1570864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1571864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fisttp_s(const Operand& adr) { 1572e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 1573864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1574864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1575864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ecx, adr); 1576864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1577864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1578864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1579864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fisttp_d(const Operand& adr) { 1580e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsEnabled(SSE3)); 1581864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1582864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDD); 1583864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ecx, adr); 1584864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1585864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1586864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1587864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fist_s(const Operand& adr) { 1588864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1589864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1590864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edx, adr); 1591864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1592864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1593864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1594864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fistp_d(const Operand& adr) { 1595864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1596864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDF); 1597864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(edi, adr); 1598864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1599864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1600864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1601864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fabs() { 1602864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1603864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1604864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE1); 1605864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1606864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1607864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1608864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fchs() { 1609864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1610864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1611864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE0); 1612864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1613864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1614864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 161506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fsqrt() { 161606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 161706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xD9); 161806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xFA); 161906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 162006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 162106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 1622864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fcos() { 1623864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1624864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1625864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFF); 1626864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1627864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1628864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1629864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fsin() { 1630864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1631864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1632864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFE); 1633864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1634864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1635864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1636864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fptan() { 1637864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1638864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1639864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF2); 1640864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1641864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1642864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1643864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fyl2x() { 1644864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1645864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1646864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF1); 1647864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1648864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1649864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1650864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::f2xm1() { 1651864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1652864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1653864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF0); 1654864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1655864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1656864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1657864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fscale() { 1658864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1659864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1660864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFD); 1661864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1662864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1663864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1664864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fninit() { 1665864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1666864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1667864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE3); 1668864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1669864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1670864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1671864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fadd(int i) { 1672864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1673864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDC, 0xC0, i); 1674864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1675864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1676864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1677864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fadd_i(int i) { 1678864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1679864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD8, 0xC0, i); 1680864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1681864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1682864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 168306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fadd_d(const Operand& adr) { 168406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 168506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xDC); 168606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org emit_operand(eax, adr); 168706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 168806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 168906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 1690864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fsub(int i) { 1691864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1692864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDC, 0xE8, i); 1693864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1694864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1695864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1696864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fsub_i(int i) { 1697864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1698864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD8, 0xE0, i); 1699864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1700864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1701864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1702864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fisub_s(const Operand& adr) { 1703864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1704864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDA); 1705864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(esp, adr); 1706864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1707864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1708864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1709864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fmul_i(int i) { 1710864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1711864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD8, 0xC8, i); 1712864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1713864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1714864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1715864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fmul(int i) { 1716864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1717864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDC, 0xC8, i); 1718864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1719864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1720864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1721864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fdiv(int i) { 1722864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1723864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDC, 0xF8, i); 1724864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1725864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1726864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1727864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fdiv_i(int i) { 1728864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1729864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD8, 0xF0, i); 1730864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1731864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1732864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1733864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::faddp(int i) { 1734864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1735864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDE, 0xC0, i); 1736864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1737864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1738864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1739864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fsubp(int i) { 1740864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1741864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDE, 0xE8, i); 1742864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1743864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1744864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1745864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fsubrp(int i) { 1746864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1747864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDE, 0xE0, i); 1748864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1749864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1750864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1751864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fmulp(int i) { 1752864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1753864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDE, 0xC8, i); 1754864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1755864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1756864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1757864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fdivp(int i) { 1758864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1759864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDE, 0xF8, i); 1760864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1761864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1762864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1763864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fprem() { 1764864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1765864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1766864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF8); 1767864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1768864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1769864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1770864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fprem1() { 1771864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1772864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1773864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF5); 1774864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1775864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1776864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1777864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fxch(int i) { 1778864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1779864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xD9, 0xC8, i); 1780864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1781864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1782864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1783864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fincstp() { 1784864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1785864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1786864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xF7); 1787864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1788864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1789864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1790864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::ffree(int i) { 1791864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1792864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDD, 0xC0, i); 1793864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1794864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1795864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1796864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::ftst() { 1797864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1798864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1799864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE4); 1800864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1801864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1802864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 180306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fxam() { 180406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 180506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xD9); 180606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xE5); 180706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 180806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 180906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 1810864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fucomp(int i) { 1811864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1812864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_farith(0xDD, 0xE8, i); 1813864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1814864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1815864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1816864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fucompp() { 1817864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1818864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDA); 1819864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1820864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1821864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1822864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1823864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fucomi(int i) { 1824864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1825864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1826864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE8 + i); 1827864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1828864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1829864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1830864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fucomip() { 1831864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1832864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDF); 1833864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE9); 1834864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1835864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1836864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1837864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fcompp() { 1838864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1839864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDE); 1840864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1841864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1842864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1843864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1844864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fnstsw_ax() { 1845864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1846864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDF); 1847864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE0); 1848864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1849864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1850864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1851864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fwait() { 1852864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1853864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x9B); 1854864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1855864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1856864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1857864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::frndint() { 1858864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1859864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xD9); 1860864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xFC); 1861864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1862864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1863864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1864864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::fnclex() { 1865864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1866864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xDB); 1867864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xE2); 1868864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1869864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1870864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 187106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::fnsave(const Operand& adr) { 187206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 187306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xDD); 187406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org emit_operand(esi, adr); 187506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 187606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 187706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 187806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid Assembler::frstor(const Operand& adr) { 187906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpace ensure_space(this); 188006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EMIT(0xDD); 188106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org emit_operand(esp, adr); 188206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 188306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 188406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 1885864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::sahf() { 1886864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1887864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x9E); 1888864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1889864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1890864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1891864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::setcc(Condition cc, Register reg) { 1892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg.is_byte_register()); 1893864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1894864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x0F); 1895864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x90 | cc); 1896864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0xC0 | reg.code()); 1897864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1898864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1899864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1900864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::Print() { 1901864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Disassembler::Decode(isolate(), stdout, buffer_, pc_); 1902864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1903864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1904864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1905864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::RecordJSReturn() { 1906864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1907864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1908864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RecordRelocInfo(RelocInfo::JS_RETURN); 1909864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1910864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1911864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1912864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::RecordDebugBreakSlot() { 1913864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org positions_recorder()->WriteRecordedPositions(); 1914864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1915864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); 1916864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1917864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1918864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1919864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::RecordComment(const char* msg, bool force) { 1920864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (FLAG_code_comments || force) { 1921864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 1922864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); 1923864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1924864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1925864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1926864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1927864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::GrowBuffer() { 1928e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(buffer_overflow()); 1929864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (!own_buffer_) FATAL("external code buffer is too small"); 1930864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1931864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Compute new buffer size. 1932864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org CodeDesc desc; // the new buffer 19339d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org desc.buffer_size = 2 * buffer_size_; 19349d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 1935864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Some internal data structures overflow for very large buffers, 1936864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // they must ensure that kMaximalBufferSize is not too large. 1937864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if ((desc.buffer_size > kMaximalBufferSize) || 1938864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) { 1939864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org V8::FatalProcessOutOfMemory("Assembler::GrowBuffer"); 1940864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1941864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1942864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Set up new buffer. 1943864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc.buffer = NewArray<byte>(desc.buffer_size); 1944864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc.instr_size = pc_offset(); 1945864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos()); 1946864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1947864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Clear the buffer in debug mode. Use 'int3' instructions to make 1948864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // sure to get into problems if we ever run uninitialized code. 1949864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef DEBUG 1950864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org memset(desc.buffer, 0xCC, desc.buffer_size); 1951864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 1952864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1953864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Copy the data. 1954864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int pc_delta = desc.buffer - buffer_; 1955864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 1956d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(desc.buffer, buffer_, desc.instr_size); 1957d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(), 1958d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org desc.reloc_size); 1959864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 19609d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org DeleteArray(buffer_); 1961864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org buffer_ = desc.buffer; 1962864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org buffer_size_ = desc.buffer_size; 1963864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org pc_ += pc_delta; 1964864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 1965864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org reloc_info_writer.last_pc() + pc_delta); 1966864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1967864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Relocate runtime entries. 1968864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (RelocIterator it(desc); !it.done(); it.next()) { 1969864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo::Mode rmode = it.rinfo()->rmode(); 1970864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (rmode == RelocInfo::INTERNAL_REFERENCE) { 1971864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 1972864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (*p != 0) { // 0 means uninitialized. 1973864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org *p += pc_delta; 1974864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1975864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1976864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 1977864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1978e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!buffer_overflow()); 1979864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1980864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1981864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1982864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { 1983e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode 1984e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(imm8)); 1985e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((op1 & 0x01) == 0); // should be 8bit operation 1986864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(op1); 1987864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(op2 | dst.code()); 1988864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(imm8); 1989864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 1990864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1991864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 1992864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { 1993e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((0 <= sel) && (sel <= 7)); 1994864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org Register ireg = { sel }; 1995864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (x.is_int8()) { 1996864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x83); // using a sign-extended 8-bit immediate. 1997864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ireg, dst); 1998864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(x.x_ & 0xFF); 1999864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else if (dst.is_reg(eax)) { 2000864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT((sel << 3) | 0x05); // short form if the destination is eax. 2001864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(x); 2002864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } else { 2003864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(0x81); // using a literal 32-bit immediate. 2004864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit_operand(ireg, dst); 2005864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(x); 2006864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 2007864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2008864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2009864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2010864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::emit_operand(Register reg, const Operand& adr) { 2011864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const unsigned length = adr.len_; 2012e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(length > 0); 2013864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2014864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Emit updated ModRM byte containing the given register. 2015864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3); 2016864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2017864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Emit the rest of the encoded operand. 2018864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i]; 2019864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org pc_ += length; 2020864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2021864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Emit relocation information if necessary. 2022864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) { 2023864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 2024864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RecordRelocInfo(adr.rmode_); 2025864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org pc_ += sizeof(int32_t); 2026864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 2027864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2028864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2029864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2030864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::emit_farith(int b1, int b2, int i) { 2031e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2032e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= i && i < 8); // illegal stack offset 2033864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(b1); 2034864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(b2 + i); 2035864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2036864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2037864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2038864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::db(uint8_t data) { 2039864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 2040864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EMIT(data); 2041864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2042864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2043864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2044864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::dd(uint32_t data) { 2045864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org EnsureSpace ensure_space(this); 2046864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org emit(data); 2047864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2048864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2049864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2050864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 2051e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!RelocInfo::IsNone(rmode)); 2052864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // Don't record external references unless the heap will be serialized. 2053864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (rmode == RelocInfo::EXTERNAL_REFERENCE && 2054864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org !serializer_enabled() && !emit_debug_code()) { 2055864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 2056864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 2057864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org RelocInfo rinfo(pc_, rmode, data, NULL); 2058864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org reloc_info_writer.Write(&rinfo); 2059864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2060864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2061864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2062864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgHandle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) { 2063864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // No out-of-line constant pool support. 2064e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 2065864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return isolate->factory()->empty_constant_pool_array(); 2066864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2067864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2068864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2069864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) { 2070864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org // No out-of-line constant pool support. 2071e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!FLAG_enable_ool_constant_pool); 2072864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org return; 2073864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2074864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2075864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2076864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef GENERATED_CODE_COVERAGE 2077864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgstatic FILE* coverage_log = NULL; 2078864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2079864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2080864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgstatic void InitCoverageLog() { 2081864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG"); 2082864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (file_name != NULL) { 2083864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org coverage_log = fopen(file_name, "aw+"); 2084864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 2085864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2086864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2087864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2088864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgvoid LogGeneratedCodeCoverage(const char* file_line) { 2089864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org const char* return_address = (&file_line)[-1]; 2090864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org char* push_insn = const_cast<char*>(return_address - 12); 2091864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org push_insn[0] = 0xeb; // Relative branch insn. 2092864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org push_insn[1] = 13; // Skip over coverage insns. 2093864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org if (coverage_log != NULL) { 2094864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org fprintf(coverage_log, "%s\n", file_line); 2095864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org fflush(coverage_log); 2096864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org } 2097864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} 2098864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2099864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif 2100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} } // namespace v8::internal 2102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org 2103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif // V8_TARGET_ARCH_X87 2104