assembler-ia32.cc revision 109988c7ccb6f3fd1a58574fa3dfb88beaef6632
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright (c) 1994-2006 Sun Microsystems Inc.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All Rights Reserved.
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// are met:
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistributions of source code must retain the above copyright notice,
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this list of conditions and the following disclaimer.
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Redistribution in binary form must reproduce the above copyright
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer in the
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// documentation and/or other materials provided with the
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// distribution.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Neither the name of Sun Microsystems or the names of contributors may
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// be used to endorse or promote products derived from this software without
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// specific prior written permission.
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THE POSSIBILITY OF SUCH DAMAGE.
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The original source code covered by the above license above has been modified
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// significantly by Google Inc.
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/ia32/assembler-ia32.h"
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <cstring>
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_IA32
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_LIBC_MSVCRT
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <intrin.h>  // _xgetbv()
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_OS_MACOSX
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <sys/sysctl.h>
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/cpu.h"
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disassembler.h"
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h"
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/v8.h"
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of CpuFeatures
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace {
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_LIBC_MSVCRT
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochV8_INLINE uint64_t _xgetbv(unsigned int xcr) {
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned eax, edx;
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check xgetbv; this uses a .byte sequence instead of the instruction
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // directly because older assemblers do not include support for xgetbv and
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // there is no easy way to conditionally compile based on the assembler
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // used.
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  __asm__ volatile(".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(xcr));
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<uint64_t>(eax) | (static_cast<uint64_t>(edx) << 32);
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define _XCR_XFEATURE_ENABLED_MASK 0
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // !V8_LIBC_MSVCRT
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool OSHasAVXSupport() {
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_OS_MACOSX
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Mac OS X up to 10.9 has a bug where AVX transitions were indeed being
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // caused by ISRs, so we detect that here and disable AVX in that case.
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  char buffer[128];
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t buffer_size = arraysize(buffer);
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int ctl_name[] = {CTL_KERN, KERN_OSRELEASE};
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (sysctl(ctl_name, 2, buffer, &buffer_size, nullptr, 0) != 0) {
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    V8_Fatal(__FILE__, __LINE__, "V8 failed to get kernel version");
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // The buffer now contains a string of the form XX.YY.ZZ, where
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // XX is the major kernel version component.
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  char* period_pos = strchr(buffer, '.');
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_NOT_NULL(period_pos);
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  *period_pos = '\0';
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  long kernel_version_major = strtol(buffer, nullptr, 10);  // NOLINT
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (kernel_version_major <= 13) return false;
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif  // V8_OS_MACOSX
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check whether OS claims to support AVX.
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint64_t feature_mask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (feature_mask & 0x6) == 0x6;
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}  // namespace
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::ProbeImpl(bool cross_compile) {
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::CPU cpu;
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(cpu.has_sse2());  // SSE2 support is mandatory.
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(cpu.has_cmov());  // CMOV support is mandatory.
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only use statically determined features for cross compile (snapshot).
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (cross_compile) return;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1;
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3;
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_avx() && FLAG_enable_avx && cpu.has_osxsave() &&
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      OSHasAVXSupport()) {
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    supported_ |= 1u << AVX;
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() &&
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      OSHasAVXSupport()) {
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    supported_ |= 1u << FMA3;
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_bmi1() && FLAG_enable_bmi1) supported_ |= 1u << BMI1;
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_bmi2() && FLAG_enable_bmi2) supported_ |= 1u << BMI2;
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_lzcnt() && FLAG_enable_lzcnt) supported_ |= 1u << LZCNT;
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (cpu.has_popcnt() && FLAG_enable_popcnt) supported_ |= 1u << POPCNT;
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (strcmp(FLAG_mcpu, "auto") == 0) {
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (cpu.is_atom()) supported_ |= 1u << ATOM;
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (strcmp(FLAG_mcpu, "atom") == 0) {
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    supported_ |= 1u << ATOM;
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid CpuFeatures::PrintTarget() { }
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid CpuFeatures::PrintFeatures() {
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  printf(
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "SSE3=%d SSE4_1=%d AVX=%d FMA3=%d BMI1=%d BMI2=%d LZCNT=%d POPCNT=%d "
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "ATOM=%d\n",
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSE4_1),
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatures::IsSupported(AVX), CpuFeatures::IsSupported(FMA3),
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(BMI2),
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(POPCNT),
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CpuFeatures::IsSupported(ATOM));
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Displacement
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Displacement::init(Label* L, Type type) {
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!L->is_bound());
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int next = 0;
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_linked()) {
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    next = L->pos();
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(next > 0);  // Displacements must be at positions > 0
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Ensure that we _never_ overflow the next field.
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(NextField::is_valid(Assembler::kMaximalBufferSize));
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  data_ = NextField::encode(next) | TypeField::encode(type);
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of RelocInfo
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst int RelocInfo::kApplyMask =
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    1 << RelocInfo::INTERNAL_REFERENCE | 1 << RelocInfo::CODE_AGE_SEQUENCE |
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RelocInfo::kDebugBreakSlotMask;
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
176f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkebool RelocInfo::IsCodedSpecially() {
177f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  // The deserializer needs to know whether a pointer is specially coded.  Being
178f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  // specially coded on IA32 means that it is a relative address, as used by
179f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  // branch instructions.  These are also the ones that need changing when a
180f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  // code object moves.
181f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  return (1 << rmode_) & kApplyMask;
182f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
183f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
184f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool RelocInfo::IsInConstantPool() {
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return false;
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Operand
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) {
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [base + disp/r]
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base]
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, base);
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp8]
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, base);
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp/r]
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, base);
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base,
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 Register index,
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 ScaleFactor scale,
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 int32_t disp,
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 RelocInfo::Mode rmode) {
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!index.is(esp));  // illegal addressing mode
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [base + index*scale + disp/r]
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale]
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, esp);
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp8]
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, esp);
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp/r]
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, esp);
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register index,
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 ScaleFactor scale,
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 int32_t disp,
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 RelocInfo::Mode rmode) {
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!index.is(esp));  // illegal addressing mode
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [index*scale + disp/r]
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_modrm(0, esp);
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_sib(scale, index, ebp);
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_dispr(disp, rmode);
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Operand::is_reg(Register reg) const {
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((buf_[0] & 0xF8) == 0xC0)  // addressing mode is register only.
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && ((buf_[0] & 0x07) == reg.code());  // register codes match.
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Operand::is_reg_only() const {
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (buf_[0] & 0xF8) == 0xC0;  // Addressing mode is register only.
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRegister Operand::reg() const {
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_reg_only());
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Register::from_code(buf_[0] & 0x07);
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Implementation of Assembler.
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Emit a single byte. Must always be inlined.
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define EMIT(x)                                 \
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *pc_++ = (x)
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog();
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size)
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : AssemblerBase(isolate, buffer, buffer_size),
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      positions_recorder_(this) {
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the buffer in debug mode unless it was provided by the
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // caller in which case we can't be sure it's okay to overwrite
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // existing code in it; see CodePatcher::CodePatcher(...).
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (own_buffer_) {
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    memset(buffer_, 0xCC, buffer_size_);  // int3
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InitCoverageLog();
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GetCode(CodeDesc* desc) {
3003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Finalize code (at this point overflow() may be true, but the gap ensures
3013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // that we are still not overlapping instructions and relocation info).
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  reloc_info_writer.Finish();
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(pc_ <= reloc_info_writer.pos());  // No overlap.
3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up code descriptor.
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer = buffer_;
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer_size = buffer_size_;
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->instr_size = pc_offset();
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->origin = this;
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc->constant_pool_size = 0;
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Align(int m) {
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(base::bits::IsPowerOfTwo32(m));
3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int mask = m - 1;
3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int addr = pc_offset();
3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Nop((m - (addr & mask)) & mask);
3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Assembler::IsNop(Address addr) {
3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address a = addr;
3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (*a == 0x66) a++;
3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (*a == 0x90) return true;
3263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (a[0] == 0xf && a[1] == 0x1f) return true;
3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return false;
3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::Nop(int bytes) {
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (bytes > 0) {
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    switch (bytes) {
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 2:
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 1:
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x90);
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 3:
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 4:
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x40);
3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 6:
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 5:
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x44);
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 7:
3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x80);
3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      default:
3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 11:
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 10:
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 9:
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 8:
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x84);
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes -= 8;
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3969dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenvoid Assembler::CodeTargetAlign() {
3979dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Align(16);  // Preferred alignment of jump targets on ia32.
3989dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen}
3999dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
4009dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cpuid() {
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA2);
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushad() {
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x60);
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popad() {
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x61);
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushfd() {
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9C);
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popfd() {
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9D);
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Immediate& x) {
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6a);
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_);
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x68);
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::push_imm32(int32_t imm32) {
445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x68);
447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(imm32);
448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(Register src) {
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x50 | src.code());
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Operand& src) {
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esi, src);
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(Register dst) {
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58 | dst.code());
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(const Operand& dst) {
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8F);
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::enter(const Immediate& size) {
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8);
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(size);
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0);
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::leave() {
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC9);
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(Register dst, const Operand& src) {
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8A);
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_b(const Operand& dst, const Immediate& src) {
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC6);
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_));
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, Register src) {
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(src.is_byte_register());
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x88);
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(Register dst, const Operand& src) {
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(const Operand& dst, Register src) {
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_w(const Operand& dst, const Immediate& src) {
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC7);
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(eax, dst);
537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ & 0xff));
538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ >> 8));
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, int32_t imm32) {
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm32);
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Immediate& x) {
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Handle<Object> handle) {
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Operand& src) {
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Register src) {
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | src.code() << 3 | dst.code());
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, const Immediate& x) {
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Handle<Object> handle) {
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Register src) {
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_b(Register dst, const Operand& src) {
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBE);
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_w(Register dst, const Operand& src) {
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBF);
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_b(Register dst, const Operand& src) {
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB6);
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_w(Register dst, const Operand& src) {
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB7);
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) {
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Opcode: 0f 40 + cc /r.
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 + cc);
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6416ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cld() {
6426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xFC);
6446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
647e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::rep_movs() {
648e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
649e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
650e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xA5);
651e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
652e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
653e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
6546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::rep_stos() {
6556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
6576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xAB);
6586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
661f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkevoid Assembler::stos() {
662f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EnsureSpace ensure_space(this);
663f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EMIT(0xAB);
664f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
665f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
666f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xchg(Register dst, Register src) {
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (src.is(eax) || dst.is(eax)) {  // Single-byte encoding.
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x90 | (src.is(eax) ? dst.code() : src.code()));
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x87);
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC0 | src.code() << 3 | dst.code());
674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xchg(Register dst, const Operand& src) {
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x87);
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, int32_t imm32) {
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(2, Operand(dst), Immediate(imm32));
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, const Operand& src) {
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x13);
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(Register dst, const Operand& src) {
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x03);
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::add(const Operand& dst, Register src) {
7063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x01);
7083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
7093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(const Operand& dst, const Immediate& x) {
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(0, dst, x);
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, int32_t imm32) {
72059151504615d929945dc59db37bf1166937748c6Steve Block  and_(dst, Immediate(imm32));
72159151504615d929945dc59db37bf1166937748c6Steve Block}
72259151504615d929945dc59db37bf1166937748c6Steve Block
72359151504615d929945dc59db37bf1166937748c6Steve Block
72459151504615d929945dc59db37bf1166937748c6Steve Blockvoid Assembler::and_(Register dst, const Immediate& x) {
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
72659151504615d929945dc59db37bf1166937748c6Steve Block  emit_arith(4, Operand(dst), x);
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, const Operand& src) {
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x23);
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, const Immediate& x) {
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(4, dst, x);
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, Register src) {
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x21);
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb(const Operand& op, int8_t imm8) {
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op.is_reg(eax)) {
7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x3C);
7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x80);
7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    emit_operand(edi, op);  // edi == 7
7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(imm8);
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(const Operand& op, Register reg) {
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
764d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
765d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x38);
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
767d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
768d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
769d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(Register reg, const Operand& op) {
7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
772d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
773d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x3A);
7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
775d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
776d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
777d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw(const Operand& op, Immediate imm16) {
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(imm16.is_int16());
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x81);
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, op);
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(imm16);
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, int32_t imm32) {
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(imm32));
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, Handle<Object> handle) {
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(handle));
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, const Operand& op) {
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x3B);
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
806109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cmp(const Operand& op, Register reg) {
807109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
808109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x39);
809109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_operand(reg, op);
810109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, const Immediate& imm) {
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, imm);
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, Handle<Object> handle) {
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, Immediate(handle));
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb_al(const Operand& op) {
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x38);  // CMP r/m8, r8
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register al.
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw_ax(const Operand& op) {
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x39);  // CMP r/m16, r16
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register ax.
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec_b(Register dst) {
8403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8 | dst.code());
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8470d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::dec_b(const Operand& dst) {
8480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
8490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xFE);
8500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_operand(ecx, dst);
8510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
8520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
8530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(Register dst) {
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x48 | dst.code());
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(const Operand& dst) {
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, dst);
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cdq() {
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x99);
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::idiv(const Operand& src) {
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, src);
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::div(const Operand& src) {
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esi, src);
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register reg) {
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8 | reg.code());
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, const Operand& src) {
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAF);
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, Register src, int32_t imm32) {
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  imul(dst, Operand(src), imm32);
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) {
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_int8(imm32)) {
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6B);
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm32);
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x69);
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(imm32);
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(Register dst) {
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 | dst.code());
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(const Operand& dst) {
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::lea(Register dst, const Operand& src) {
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8D);
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mul(Register src) {
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0 | src.code());
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::neg(Register dst) {
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD8 | dst.code());
952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::neg(const Operand& dst) {
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebx, dst);
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::not_(Register dst) {
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD0 | dst.code());
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::not_(const Operand& dst) {
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, dst);
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, int32_t imm32) {
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, Operand(dst), Immediate(imm32));
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, const Operand& src) {
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0B);
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, const Immediate& x) {
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, dst, x);
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, Register src) {
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x09);
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rcl(Register dst, uint8_t imm8) {
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1016756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Assembler::rcr(Register dst, uint8_t imm8) {
1017756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  EnsureSpace ensure_space(this);
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1019756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (imm8 == 1) {
1020756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD1);
1021756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1022756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  } else {
1023756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xC1);
1024756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1025756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(imm8);
1026756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
1027756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1028756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1029756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror(const Operand& dst, uint8_t imm8) {
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (imm8 == 1) {
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xD1);
1035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC1);
1038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(imm8);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror_cl(const Operand& dst) {
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD3);
1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_operand(ecx, dst);
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar(const Operand& dst, uint8_t imm8) {
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar_cl(const Operand& dst) {
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, dst);
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sbb(Register dst, const Operand& src) {
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x1B);
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shld(Register dst, const Operand& src) {
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA5);
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl(const Operand& dst, uint8_t imm8) {
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl_cl(const Operand& dst) {
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esp, dst);
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::shrd(Register dst, const Operand& src) {
1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAD);
1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr(const Operand& dst, uint8_t imm8) {
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1119d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (imm8 == 1) {
1120d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xD1);
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1122d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  } else {
1123d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xC1);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1125d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(imm8);
1126d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr_cl(const Operand& dst) {
1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1132d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  EMIT(0xD3);
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebp, dst);
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, const Immediate& x) {
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(5, dst, x);
1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(Register dst, const Operand& src) {
1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2B);
1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, Register src) {
1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x29);
1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Immediate& imm) {
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test_b(reg, imm.x_);
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This is not using emit_arith because test doesn't support
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // sign-extension of 8-bit operands.
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA9);
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(imm);
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Operand& op) {
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x85);
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1183e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::test_b(Register reg, const Operand& op) {
11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
1185e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1186e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x84);
1187e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(reg, op);
1188e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1189e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1190e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(const Operand& op, const Immediate& imm) {
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test(op.reg(), imm);
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsNone(imm.rmode_) && is_uint8(imm.x_)) {
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return test_b(op, imm.x_);
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);
1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm);
1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::test_b(Register reg, uint8_t imm8) {
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only use test against byte for registers that have a byte
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // variant: eax, ebx, ecx, and edx.
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA8);
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(imm8);
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (reg.is_byte_register()) {
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_arith_b(0xF6, 0xC0, reg, imm8);
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(imm8);
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::test_b(const Operand& op, uint8_t imm8) {
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test_b(op.reg(), imm8);
12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return;
12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12287f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
12297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0xF6);
12307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_operand(eax, op);
12317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(imm8);
12327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
12337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
12347f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, int32_t imm32) {
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, Operand(dst), Immediate(imm32));
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, const Operand& src) {
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x33);
1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::xor_(const Operand& dst, Register src) {
1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x31);
12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& dst, const Immediate& x) {
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, dst, x);
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bt(const Operand& dst, Register src) {
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA3);
1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bts(const Operand& dst, Register src) {
1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAB);
1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bsr(Register dst, const Operand& src) {
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xBD);
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bsf(Register dst, const Operand& src) {
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::hlt() {
1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF4);
1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::int3() {
1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xCC);
1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::nop() {
1306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90);
1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ret(int imm16) {
1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint16(imm16));
1314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm16 == 0) {
1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC3);
1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC2);
1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm16 & 0xFF);
1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((imm16 >> 8) & 0xFF);
1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::ud2() {
1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0B);
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Labels refer to positions in the (to be) generated code.
1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There are bound, linked, and unused labels.
1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Bound labels refer to known positions in the already
1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// generated code. pos() is the position the label refers to.
1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Linked labels refer to unknown positions in the code
1338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be generated; pos() is the position of the 32bit
1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Displacement of the last instruction using the label.
1340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::print(Label* L) {
1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_unused()) {
1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unused label\n");
1345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_bound()) {
1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("bound label to %d\n", L->pos());
1347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_linked()) {
1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label l = *L;
1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unbound label");
1350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    while (l.is_linked()) {
1351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Displacement disp = disp_at(&l);
1352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("@ %d ", l.pos());
1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.print();
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("\n");
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.next(&l);
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("label in inconsistent state (pos = %d)\n", L->pos_);
1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind_to(Label* L, int pos) {
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= pos && pos <= pc_offset());  // must have a valid binding position
1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (L->is_linked()) {
1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Displacement disp = disp_at(L);
1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int fixup_pos = L->pos();
1369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (disp.type() == Displacement::CODE_ABSOLUTE) {
1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      long_at_put(fixup_pos, reinterpret_cast<int>(buffer_ + pos));
1371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      internal_reference_positions_.push_back(fixup_pos);
1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else if (disp.type() == Displacement::CODE_RELATIVE) {
1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Relative to Code* heap object pointer.
1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag);
1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (disp.type() == Displacement::UNCONDITIONAL_JUMP) {
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(byte_at(fixup_pos - 1) == 0xE9);  // jmp expected
1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
13793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Relative address, relative to point after address.
1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int imm32 = pos - (fixup_pos + sizeof(int32_t));
1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, imm32);
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    disp.next(L);
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1385257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  while (L->is_near_linked()) {
1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int fixup_pos = L->near_link_pos();
1387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int offset_to_next =
1388257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos)));
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offset_to_next <= 0);
1390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Relative address, relative to point after address.
1391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int disp = pos - fixup_pos - sizeof(int8_t);
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(0 <= disp && disp <= 127);
1393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_byte_at(fixup_pos, disp);
1394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (offset_to_next < 0) {
1395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->link_to(fixup_pos + offset_to_next, Label::kNear);
1396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
1397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->UnuseNear();
1398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  L->bind_to(pos);
1401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind(Label* L) {
1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!L->is_bound());  // label can only be bound once
1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bind_to(L, pc_offset());
1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Label* L) {
1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  positions_recorder()->WriteRecordedPositions();
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size = 5;
1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
14183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(offs - long_size);
1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
14223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) {
1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  positions_recorder()->WriteRecordedPositions();
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(const Operand& adr) {
1443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call size is 1 (opcode) + adr.len_ (operand).
1444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 + adr.len_;
1445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(const Operand& adr) {
1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  positions_recorder()->WriteRecordedPositions();
1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) {
1457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 /* EMIT */ + sizeof(uint32_t) /* emit */;
1458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::call(Handle<Code> code,
1462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     RelocInfo::Mode rmode,
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     TypeFeedbackId ast_id) {
14643e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  positions_recorder()->WriteRecordedPositions();
1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode)
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      || rmode == RelocInfo::CODE_AGE_SEQUENCE);
1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode, ast_id);
1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::jmp(Label* L, Label::Distance distance) {
1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 5;
1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
14813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1011 #8-bit disp.
1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xEB);
1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
14853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1001 #32-bit disp.
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xE9);
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0xEB);
1491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1001 #32-bit disp.
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE9);
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(const Operand& adr) {
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) {
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode));
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode);
1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) {
15280d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= cc && static_cast<int>(cc) < 16);
1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 6;
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0111 tttn #8-bit disp
1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x70 | cc);
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0000 1111 1000 tttn #32-bit disp
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x0F);
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x80 | cc);
1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0x70 | cc);
1547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // 0000 1111 1000 tttn #32-bit disp
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Note: could eliminate cond. jumps to this jump if condition
1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    //       is the same however, seems to be rather unlikely case.
1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x0F);
1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x80 | cc);
1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) {
1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= cc) && (static_cast<int>(cc) < 16));
15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // 0000 1111 1000 tttn #32-bit disp.
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::j(Condition cc, Handle<Code> code, RelocInfo::Mode rmode) {
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 0000 1111 1000 tttn #32-bit disp
1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit(code, rmode);
1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// FPU instructions.
1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld(int i) {
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC0, i);
1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1590402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fstp(int i) {
1591402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1592402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_farith(0xDD, 0xD8, i);
1593402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1594402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1595402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld1() {
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1603402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fldpi() {
1604402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1605402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xD9);
1606402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xEB);
1607402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1608402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1609402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fldz() {
1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xEE);
1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fldln2() {
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xED);
1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_s(const Operand& adr) {
1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_d(const Operand& adr) {
1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_s(const Operand& adr) {
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fst_s(const Operand& adr) {
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD9);
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, adr);
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_d(const Operand& adr) {
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1659402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fst_d(const Operand& adr) {
1660402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1661402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xDD);
1662402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_operand(edx, adr);
1663402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1664402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1665402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_s(const Operand& adr) {
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_d(const Operand& adr) {
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebp, adr);
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_s(const Operand& adr) {
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisttp_s(const Operand& adr) {
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, adr);
1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1695e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::fisttp_d(const Operand& adr) {
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1697e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1698e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xDD);
1699e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(ecx, adr);
1700e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1701e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1702e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fist_s(const Operand& adr) {
1704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_d(const Operand& adr) {
1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, adr);
1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fabs() {
1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE1);
1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fchs() {
1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
1728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcos() {
1732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsin() {
1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fptan() {
17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF2);
17493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fyl2x() {
1753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xF1);
1756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::f2xm1() {
17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF0);
17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fscale() {
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xFD);
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fninit() {
17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xDB);
17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xE3);
17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fadd(int i) {
1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC0, i);
1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd_i(int i) {
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC0, i);
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsub(int i) {
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xE8, i);
1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsub_i(int i) {
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xE0, i);
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisub_s(const Operand& adr) {
1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmul_i(int i) {
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC8, i);
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmul(int i) {
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC8, i);
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdiv(int i) {
1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xF8, i);
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdiv_i(int i) {
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xF0, i);
1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::faddp(int i) {
1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC0, i);
1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubp(int i) {
1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE8, i);
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubrp(int i) {
1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE0, i);
1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmulp(int i) {
1854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC8, i);
1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdivp(int i) {
1860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xF8, i);
1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem() {
1866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF8);
1869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem1() {
1873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF5);
1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fxch(int i) {
1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC8, i);
1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fincstp() {
1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ffree(int i) {
1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xC0, i);
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ftst() {
1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE4);
1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucomp(int i) {
1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xE8, i);
1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucompp() {
1912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomi(int i) {
19193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
19203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDB);
19213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE8 + i);
19223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
19233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
19243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
19253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomip() {
19263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
19273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDF);
19283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE9);
19293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
19303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
19313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcompp() {
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDE);
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnstsw_ax() {
1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fwait() {
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9B);
1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::frndint() {
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFC);
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnclex() {
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE2);
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sahf() {
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9E);
1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::setcc(Condition cc, Register reg) {
1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reg.is_byte_register());
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90 | cc);
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | reg.code());
1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttss2si(Register dst, const Operand& src) {
1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF3);
1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttsd2si(Register dst, const Operand& src) {
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cvtsd2si(Register dst, XMMRegister src) {
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x2D);
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2008109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cvtsi2ss(XMMRegister dst, const Operand& src) {
2009109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
2010109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0xF3);
2011109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x0F);
2012109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x2A);
2013109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_sse_operand(dst, src);
2014109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
2015109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2016109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
2018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2A);
2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtss2sd(XMMRegister dst, const Operand& src) {
20276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
20286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
20296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
20306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x5A);
20316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
20326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
20336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
20346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtsd2ss(XMMRegister dst, const Operand& src) {
203644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
203744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF2);
203844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
203944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x5A);
204044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
204144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
204244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
204344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addsd(XMMRegister dst, const Operand& src) {
2045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58);
2049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulsd(XMMRegister dst, const Operand& src) {
2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x59);
2058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subsd(XMMRegister dst, const Operand& src) {
2063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5C);
2067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divsd(XMMRegister dst, const Operand& src) {
2072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5E);
2076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2080e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::xorpd(XMMRegister dst, XMMRegister src) {
2081e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2082e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2083e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2084e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x57);
2085e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2086e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2087e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2088e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::andps(XMMRegister dst, const Operand& src) {
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x54);
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orps(XMMRegister dst, const Operand& src) {
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xorps(XMMRegister dst, const Operand& src) {
2106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EnsureSpace ensure_space(this);
2107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x0F);
2108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x57);
2109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  emit_sse_operand(dst, src);
2110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addps(XMMRegister dst, const Operand& src) {
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x58);
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subps(XMMRegister dst, const Operand& src) {
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5C);
2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulps(XMMRegister dst, const Operand& src) {
2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x59);
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::divps(XMMRegister dst, const Operand& src) {
2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5E);
2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sqrtsd(XMMRegister dst, const Operand& src) {
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x51);
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21540d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::andpd(XMMRegister dst, XMMRegister src) {
21550d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
21560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
21570d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
21580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x54);
21590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
21600d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
21610d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
21620d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orpd(XMMRegister dst, XMMRegister src) {
21646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
21656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
21666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
21686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
21696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
21706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) {
21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x2E);
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_sse_operand(dst, src);
21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::roundss(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(SSE4_1));
2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x3A);
2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0A);
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Mask precision exeption.
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
219469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
219669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EnsureSpace ensure_space(this);
219769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x66);
219869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0F);
219969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x3A);
220069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0B);
220169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  emit_sse_operand(dst, src);
220269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Mask precision exeption.
220369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
220469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
220569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22076ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movmskpd(Register dst, XMMRegister src) {
22086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
22096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
22106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
22116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x50);
22126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
22136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
22146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movmskps(Register dst, XMMRegister src) {
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x50);
2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x76);
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckldq(XMMRegister dst, XMMRegister src) {
2234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x62);
2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckhdq(XMMRegister dst, XMMRegister src) {
2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x6A);
2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxsd(XMMRegister dst, const Operand& src) {
2252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minsd(XMMRegister dst, const Operand& src) {
2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22690d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
22700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
22710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xF2);
22720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
22730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xC2);
22740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
22750d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(1);  // LT == 1
22760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22790d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movaps(XMMRegister dst, XMMRegister src) {
22800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
22810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
22820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x28);
22830d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
22840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC6);
2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(imm8);
2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22970d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movdqa(const Operand& dst, XMMRegister src) {
2298e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2299e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2300e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2301e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2302e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2303e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2304e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2305e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2306e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqa(XMMRegister dst, const Operand& src) {
2307e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2308e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2309e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2310e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2311e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2312e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2313e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2314e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2315e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(const Operand& dst, XMMRegister src ) {
2316e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2317e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2318e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2319e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2320e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2321e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2322e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2323e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2324e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(XMMRegister dst, const Operand& src) {
2325e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2326e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2327e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2328e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2329e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2330e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2331e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2332e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
23337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::prefetch(const Operand& src, int level) {
2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint2(level));
23357f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
23367f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x0F);
23377f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x18);
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Emit hint number in Reg position of RegR/M.
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  XMMRegister code = XMMRegister::from_code(level);
23407f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_sse_operand(code, src);
23417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
23427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
23437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(const Operand& dst, XMMRegister src ) {
2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x11);  // store
2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(src, dst);
2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(XMMRegister dst, const Operand& src) {
2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x10);  // load
2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
236244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(const Operand& dst, XMMRegister src ) {
236344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
236444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
236544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
236644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x11);  // store
236744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(src, dst);
236844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
236944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
237044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
237144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(XMMRegister dst, const Operand& src) {
237244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
237344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
237444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
237544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x10);  // load
237644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
237744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
237844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
237944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
23806ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movd(XMMRegister dst, const Operand& src) {
23816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
23826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
23836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
23846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x6E);
23856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
23866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
23876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::movd(const Operand& dst, XMMRegister src) {
2390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x7E);
2394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
24013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
24023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x3A);
24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x17);
2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(src, dst);
24073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(imm8);
24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pand(XMMRegister dst, XMMRegister src) {
2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xDB);
2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
24206ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::pxor(XMMRegister dst, XMMRegister src) {
24216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
24226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
24236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
24246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xEF);
24256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
24266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
24276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2429b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::por(XMMRegister dst, XMMRegister src) {
2430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2431b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xEB);
2434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2437b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
24386ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ptest(XMMRegister dst, XMMRegister src) {
2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
24406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
24416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
24426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
24436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x38);
24446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x17);
24456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
24466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
24476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::pslld(XMMRegister reg, int8_t shift) {
2450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(esi, reg);  // esi == 6
2455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::psrld(XMMRegister reg, int8_t shift) {
2460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(edx, reg);  // edx == 2
2465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::psllq(XMMRegister reg, int8_t shift) {
24700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
24710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
24720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
24730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x73);
24740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(esi, reg);  // esi == 6
2475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shift);
2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psllq(XMMRegister dst, XMMRegister src) {
2480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xF3);
2484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister reg, int8_t shift) {
2489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x73);
2493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(edx, reg);  // edx == 2
2494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(shift);
2495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) {
2499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2500b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xD3);
2503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
2508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x70);
2512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shuffle);
2514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) {
2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x3A);
2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x16);
2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(offset);
25261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
25271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) {
2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
25311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EnsureSpace ensure_space(this);
25321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x66);
25331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x0F);
25341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x3A);
25351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x22);
25361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  emit_sse_operand(dst, src);
25371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(offset);
25380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
25390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
25400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::addss(XMMRegister dst, const Operand& src) {
2542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x58);
2546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::subss(XMMRegister dst, const Operand& src) {
2551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5C);
2555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mulss(XMMRegister dst, const Operand& src) {
2560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x59);
2564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divss(XMMRegister dst, const Operand& src) {
2569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5E);
2573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::sqrtss(XMMRegister dst, const Operand& src) {
2578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x51);
2582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ucomiss(XMMRegister dst, const Operand& src) {
2587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0f);
2589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x2e);
2590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxss(XMMRegister dst, const Operand& src) {
2595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minss(XMMRegister dst, const Operand& src) {
2604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// AVX instructions
2613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
2614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW1);
2618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
2624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW0);
2628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vsd(byte op, XMMRegister dst, XMMRegister src1,
2634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                    const Operand& src2) {
2635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(AVX));
2636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, kF2, k0F, kWIG);
2638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vss(byte op, XMMRegister dst, XMMRegister src1,
2644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kLIG, kF3, k0F, kWIG);
2648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vps(byte op, XMMRegister dst, XMMRegister src1,
2654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, kNone, k0F, kWIG);
2658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1,
2664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, k66, k0F, kWIG);
2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi1(byte op, Register reg, Register vreg, const Operand& rm) {
2674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kNone, k0F38, kW0);
2677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::tzcnt(Register dst, const Operand& src) {
2683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::lzcnt(Register dst, const Operand& src) {
2693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(LZCNT));
2694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBD);
2698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::popcnt(Register dst, const Operand& src) {
2703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(POPCNT));
2704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xB8);
2708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi2(SIMDPrefix pp, byte op, Register reg, Register vreg,
2713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     const Operand& rm) {
2714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, pp, k0F38, kW0);
2717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::rorx(Register dst, const Operand& src, byte imm8) {
2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_uint8(imm8));
2725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register vreg = {0};  // VEX.vvvv unused
2726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kF2, k0F3A, kW0);
2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF0);
2729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(imm8);
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { reg.code() };
2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ireg, adr);
2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) {
2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27456ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) {
27466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
27476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
27486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) {
2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC0 | (dst.code() << 3) | src.code());
2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::emit_vex_prefix(XMMRegister vreg, VectorLength l, SIMDPrefix pp,
2756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                LeadingOpcode mm, VexW w) {
2757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (mm != k0F || w != kW0) {
2758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc4);
2759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Change RXB from "110" to "111" to align with gdb disassembler.
2760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EMIT(0xe0 | mm);
2761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(w | ((~vreg.code() & 0xf) << 3) | l | pp);
2762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
2763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc5);
2764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(((~vreg.code()) << 3) | l | pp);
2765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_vex_prefix(Register vreg, VectorLength l, SIMDPrefix pp,
2770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                LeadingOpcode mm, VexW w) {
2771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  XMMRegister ivreg = {vreg.code()};
2772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(ivreg, l, pp, mm, w);
2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GrowBuffer() {
2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer_overflow());
2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!own_buffer_) FATAL("external code buffer is too small");
2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Compute new buffer size.
2781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CodeDesc desc;  // the new buffer
2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  desc.buffer_size = 2 * buffer_size_;
2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Some internal data structures overflow for very large buffers,
2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // they must ensure that kMaximalBufferSize is not too large.
2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if ((desc.buffer_size > kMaximalBufferSize) ||
278744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      (desc.buffer_size > isolate()->heap()->MaxOldGenerationSize())) {
2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8::FatalProcessOutOfMemory("Assembler::GrowBuffer");
2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up new buffer.
2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.buffer = NewArray<byte>(desc.buffer_size);
2793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc.origin = this;
2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.instr_size = pc_offset();
2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos());
2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the buffer in debug mode. Use 'int3' instructions to make
2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sure to get into problems if we ever run uninitialized code.
2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
2800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  memset(desc.buffer, 0xCC, desc.buffer_size);
2801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy the data.
2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int pc_delta = desc.buffer - buffer_;
2805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_);
2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(desc.buffer, buffer_, desc.instr_size);
2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(),
2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          desc.reloc_size);
2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Switch buffers.
2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeleteArray(buffer_);
2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_ = desc.buffer;
2813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_size_ = desc.buffer_size;
2814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += pc_delta;
2815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               reloc_info_writer.last_pc() + pc_delta);
2817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Relocate internal references.
2819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto pos : internal_reference_positions_) {
2820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t* p = reinterpret_cast<int32_t*>(buffer_ + pos);
2821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *p += pc_delta;
2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!buffer_overflow());
2825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(op1) && is_uint8(op2));  // wrong opcode
2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((op1 & 0x01) == 0);  // should be 8bit operation
2832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op1);
2833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op2 | dst.code());
2834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(imm8);
2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) {
2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= sel) && (sel <= 7));
2840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { sel };
2841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x83);  // using a sign-extended 8-bit immediate.
2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_ & 0xFF);
2845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (dst.is_reg(eax)) {
2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((sel << 3) | 0x05);  // short form if the destination is eax.
2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x81);  // using a literal 32-bit immediate.
2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_operand(Register reg, const Operand& adr) {
2857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const unsigned length = adr.len_;
2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length > 0);
2859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit updated ModRM byte containing the given register.
2861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3);
2862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit the rest of the encoded operand.
2864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i];
2865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += length;
2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit relocation information if necessary.
2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) {
2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pc_ -= sizeof(int32_t);  // pc_ must be *at* disp32
2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    RecordRelocInfo(adr.rmode_);
2871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (adr.rmode_ == RelocInfo::INTERNAL_REFERENCE) {  // Fixup for labels
2872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      emit_label(*reinterpret_cast<Label**>(pc_));
2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
2874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      pc_ += sizeof(int32_t);
2875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_label(Label* label) {
2881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (label->is_bound()) {
2882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    internal_reference_positions_.push_back(pc_offset());
2883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit(reinterpret_cast<uint32_t>(buffer_ + label->pos()));
2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit_disp(label, Displacement::CODE_ABSOLUTE);
2886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_farith(int b1, int b2, int i) {
2891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(b1) && is_uint8(b2));  // wrong opcode
2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= i &&  i < 8);  // illegal stack offset
2893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b1);
2894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b2 + i);
2895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::db(uint8_t data) {
2899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(data);
2901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::dd(uint32_t data) {
2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(data);
2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dq(uint64_t data) {
2911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_q(data);
2913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dd(Label* label) {
2917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
2919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_label(label);
2920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsNone(rmode));
2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Don't record external references unless the heap will be serialized.
2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !serializer_enabled() && !emit_debug_code()) {
2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RelocInfo rinfo(isolate(), pc_, rmode, data, NULL);
2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Write(&rinfo);
2932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef GENERATED_CODE_COVERAGE
2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic FILE* coverage_log = NULL;
2937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void InitCoverageLog() {
2940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG");
2941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (file_name != NULL) {
2942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    coverage_log = fopen(file_name, "aw+");
2943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid LogGeneratedCodeCoverage(const char* file_line) {
2948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const char* return_address = (&file_line)[-1];
2949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  char* push_insn = const_cast<char*>(return_address - 12);
2950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  push_insn[0] = 0xeb;  // Relative branch insn.
2951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  push_insn[1] = 13;    // Skip over coverage insns.
2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (coverage_log != NULL) {
2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    fprintf(coverage_log, "%s\n", file_line);
2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    fflush(coverage_log);
2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2962f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
2963f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif  // V8_TARGET_ARCH_IA32
2964