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