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