assembler-ia32.cc revision c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7a
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
189bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochAddress RelocInfo::wasm_memory_reference() {
190bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(IsWasmMemoryReference(rmode_));
191bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return Memory::Address_at(pc_);
192bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
193bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
19413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochAddress RelocInfo::wasm_global_reference() {
19513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(IsWasmGlobalReference(rmode_));
19613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return Memory::Address_at(pc_);
19713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
19813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
199bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochuint32_t RelocInfo::wasm_memory_size_reference() {
200bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(IsWasmMemorySizeReference(rmode_));
201bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return Memory::uint32_at(pc_);
202bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
203bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
20413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::unchecked_update_wasm_memory_reference(
20513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Address address, ICacheFlushMode flush_mode) {
20613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Memory::Address_at(pc_) = address;
20713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
20813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
20913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::unchecked_update_wasm_memory_size(uint32_t size,
21013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                  ICacheFlushMode flush_mode) {
21113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Memory::uint32_at(pc_) = size;
212bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Operand
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) {
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [base + disp/r]
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base]
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, base);
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp8]
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, base);
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp/r]
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, base);
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base,
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 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  // [base + index*scale + disp/r]
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale]
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, esp);
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp8]
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, esp);
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp/r]
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, esp);
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register index,
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 ScaleFactor scale,
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 int32_t disp,
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 RelocInfo::Mode rmode) {
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!index.is(esp));  // illegal addressing mode
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [index*scale + disp/r]
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_modrm(0, esp);
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_sib(scale, index, ebp);
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_dispr(disp, rmode);
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Operand::is_reg(Register reg) const {
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((buf_[0] & 0xF8) == 0xC0)  // addressing mode is register only.
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && ((buf_[0] & 0x07) == reg.code());  // register codes match.
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Operand::is_reg_only() const {
2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (buf_[0] & 0xF8) == 0xC0;  // Addressing mode is register only.
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRegister Operand::reg() const {
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_reg_only());
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Register::from_code(buf_[0] & 0x07);
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
2923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Implementation of Assembler.
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Emit a single byte. Must always be inlined.
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define EMIT(x)                                 \
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *pc_++ = (x)
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size)
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    : AssemblerBase(isolate, buffer, buffer_size) {
300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Clear the buffer in debug mode unless it was provided by the
301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// caller in which case we can't be sure it's okay to overwrite
302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// existing code in it; see CodePatcher::CodePatcher(...).
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (own_buffer_) {
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    memset(buffer_, 0xCC, buffer_size_);  // int3
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GetCode(CodeDesc* desc) {
3143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Finalize code (at this point overflow() may be true, but the gap ensures
3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // that we are still not overlapping instructions and relocation info).
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(pc_ <= reloc_info_writer.pos());  // No overlap.
3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up code descriptor.
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer = buffer_;
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer_size = buffer_size_;
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->instr_size = pc_offset();
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->origin = this;
323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc->constant_pool_size = 0;
32413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  desc->unwinding_info_size = 0;
32513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  desc->unwinding_info = nullptr;
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Align(int m) {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(base::bits::IsPowerOfTwo32(m));
3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int mask = m - 1;
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int addr = pc_offset();
3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Nop((m - (addr & mask)) & mask);
3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Assembler::IsNop(Address addr) {
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address a = addr;
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (*a == 0x66) a++;
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (*a == 0x90) return true;
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (a[0] == 0xf && a[1] == 0x1f) return true;
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return false;
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::Nop(int bytes) {
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (bytes > 0) {
3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    switch (bytes) {
3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 2:
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 1:
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x90);
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 3:
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 4:
3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x40);
3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 6:
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 5:
3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x44);
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 7:
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x80);
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      default:
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 11:
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 10:
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 9:
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 8:
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x84);
4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes -= 8;
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4119dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenvoid Assembler::CodeTargetAlign() {
4129dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Align(16);  // Preferred alignment of jump targets on ia32.
4139dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen}
4149dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
4159dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cpuid() {
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA2);
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushad() {
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x60);
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popad() {
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x61);
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushfd() {
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9C);
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popfd() {
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9D);
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Immediate& x) {
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6a);
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_);
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x68);
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::push_imm32(int32_t imm32) {
460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x68);
462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(imm32);
463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(Register src) {
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x50 | src.code());
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Operand& src) {
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esi, src);
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(Register dst) {
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58 | dst.code());
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(const Operand& dst) {
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8F);
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::enter(const Immediate& size) {
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8);
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(size);
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0);
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::leave() {
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC9);
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(Register dst, const Operand& src) {
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8A);
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_b(const Operand& dst, const Immediate& src) {
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC6);
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_));
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, Register src) {
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(src.is_byte_register());
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x88);
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(Register dst, const Operand& src) {
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(const Operand& dst, Register src) {
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_w(const Operand& dst, const Immediate& src) {
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC7);
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(eax, dst);
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ & 0xff));
553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ >> 8));
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, int32_t imm32) {
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm32);
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Immediate& x) {
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Handle<Object> handle) {
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Operand& src) {
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Register src) {
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | src.code() << 3 | dst.code());
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, const Immediate& x) {
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Handle<Object> handle) {
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Register src) {
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_b(Register dst, const Operand& src) {
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBE);
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_w(Register dst, const Operand& src) {
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBF);
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_b(Register dst, const Operand& src) {
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB6);
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_w(Register dst, const Operand& src) {
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB7);
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) {
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Opcode: 0f 40 + cc /r.
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 + cc);
652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6566ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cld() {
6576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xFC);
6596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
662e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::rep_movs() {
663e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
664e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
665e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xA5);
666e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
667e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
668e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
6696ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::rep_stos() {
6706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
6726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xAB);
6736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
676f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkevoid Assembler::stos() {
677f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EnsureSpace ensure_space(this);
678f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EMIT(0xAB);
679f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
680f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
681f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xchg(Register dst, Register src) {
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (src.is(eax) || dst.is(eax)) {  // Single-byte encoding.
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x90 | (src.is(eax) ? dst.code() : src.code()));
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x87);
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC0 | src.code() << 3 | dst.code());
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xchg(Register dst, const Operand& src) {
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x87);
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
699bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_b(Register reg, const Operand& op) {
700bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EnsureSpace ensure_space(this);
701bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x86);
702bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  emit_operand(reg, op);
703bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
705bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_w(Register reg, const Operand& op) {
706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EnsureSpace ensure_space(this);
707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x66);
708bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x87);
709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  emit_operand(reg, op);
710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::lock() {
71313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
71413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xF0);
71513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
71613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
71713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg(const Operand& dst, Register src) {
71813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
71913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
72013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB1);
72113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
72213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
72313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
72413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_b(const Operand& dst, Register src) {
72513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
72613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
72713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB0);
72813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
72913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
73013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
73113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_w(const Operand& dst, Register src) {
73213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
73313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x66);
73413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
73513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB1);
73613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
73713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
73813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, int32_t imm32) {
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(2, Operand(dst), Immediate(imm32));
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, const Operand& src) {
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x13);
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(Register dst, const Operand& src) {
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x03);
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::add(const Operand& dst, Register src) {
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x01);
7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(const Operand& dst, const Immediate& x) {
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(0, dst, x);
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, int32_t imm32) {
77459151504615d929945dc59db37bf1166937748c6Steve Block  and_(dst, Immediate(imm32));
77559151504615d929945dc59db37bf1166937748c6Steve Block}
77659151504615d929945dc59db37bf1166937748c6Steve Block
77759151504615d929945dc59db37bf1166937748c6Steve Block
77859151504615d929945dc59db37bf1166937748c6Steve Blockvoid Assembler::and_(Register dst, const Immediate& x) {
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
78059151504615d929945dc59db37bf1166937748c6Steve Block  emit_arith(4, Operand(dst), x);
781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, const Operand& src) {
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x23);
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, const Immediate& x) {
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(4, dst, x);
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, Register src) {
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x21);
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpb(const Operand& op, Immediate imm8) {
8043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm8.is_int8() || imm8.is_uint8());
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op.is_reg(eax)) {
8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x3C);
8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x80);
8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    emit_operand(edi, op);  // edi == 7
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_b(imm8);
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(const Operand& op, Register reg) {
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
818d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
819d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x38);
8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
821d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
822d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
823d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(Register reg, const Operand& op) {
8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
826d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
827d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x3A);
8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
829d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
830d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
831d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw(const Operand& op, Immediate imm16) {
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(imm16.is_int16());
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x81);
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, op);
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(imm16);
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(Register reg, const Operand& op) {
8423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
8433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
844bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x3B);
8453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
8463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
8473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(const Operand& op, Register reg) {
8493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
8503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
851bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x39);
8523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
8533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, int32_t imm32) {
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(imm32));
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, Handle<Object> handle) {
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(handle));
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, const Operand& op) {
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x3B);
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
873109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cmp(const Operand& op, Register reg) {
874109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
875109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x39);
876109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_operand(reg, op);
877109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, const Immediate& imm) {
880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, imm);
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, Handle<Object> handle) {
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, Immediate(handle));
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb_al(const Operand& op) {
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x38);  // CMP r/m8, r8
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register al.
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw_ax(const Operand& op) {
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x39);  // CMP r/m16, r16
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register ax.
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec_b(Register dst) {
9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8 | dst.code());
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9140d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::dec_b(const Operand& dst) {
9150d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
9160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xFE);
9170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_operand(ecx, dst);
9180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
9190d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
9200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(Register dst) {
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x48 | dst.code());
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(const Operand& dst) {
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, dst);
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cdq() {
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x99);
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::idiv(const Operand& src) {
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, src);
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::div(const Operand& src) {
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esi, src);
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register reg) {
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8 | reg.code());
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, const Operand& src) {
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAF);
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, Register src, int32_t imm32) {
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  imul(dst, Operand(src), imm32);
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) {
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_int8(imm32)) {
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6B);
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm32);
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x69);
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(imm32);
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(Register dst) {
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 | dst.code());
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(const Operand& dst) {
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::lea(Register dst, const Operand& src) {
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8D);
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mul(Register src) {
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0 | src.code());
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::neg(Register dst) {
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD8 | dst.code());
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::neg(const Operand& dst) {
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebx, dst);
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::not_(Register dst) {
1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD0 | dst.code());
1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::not_(const Operand& dst) {
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, dst);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, int32_t imm32) {
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, Operand(dst), Immediate(imm32));
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, const Operand& src) {
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0B);
1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, const Immediate& x) {
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, dst, x);
1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, Register src) {
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x09);
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rcl(Register dst, uint8_t imm8) {
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1083756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Assembler::rcr(Register dst, uint8_t imm8) {
1084756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  EnsureSpace ensure_space(this);
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1086756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (imm8 == 1) {
1087756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD1);
1088756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1089756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  } else {
1090756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xC1);
1091756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1092756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(imm8);
1093756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
1094756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1095756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1096756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror(const Operand& dst, uint8_t imm8) {
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (imm8 == 1) {
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xD1);
1102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC1);
1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(imm8);
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror_cl(const Operand& dst) {
1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD3);
1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_operand(ecx, dst);
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar(const Operand& dst, uint8_t imm8) {
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar_cl(const Operand& dst) {
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, dst);
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sbb(Register dst, const Operand& src) {
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x1B);
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld(Register dst, Register src, uint8_t shift) {
11453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(is_uint5(shift));
11463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xA4);
11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, Operand(dst));
11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(shift);
11513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld_cl(Register dst, Register src) {
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA5);
11573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, Operand(dst));
1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl(const Operand& dst, uint8_t imm8) {
1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl_cl(const Operand& dst) {
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esp, dst);
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr(const Operand& dst, uint8_t imm8) {
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1184d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (imm8 == 1) {
1185d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xD1);
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1187d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  } else {
1188d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xC1);
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1190d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(imm8);
1191d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr_cl(const Operand& dst) {
1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1197d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  EMIT(0xD3);
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebp, dst);
1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd(Register dst, Register src, uint8_t shift) {
12023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(is_uint5(shift));
12033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
12043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
12053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xAC);
12063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(dst, Operand(src));
12073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(shift);
12083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
12093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
12103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd_cl(const Operand& dst, Register src) {
12113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
12123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
12133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xAD);
12143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, dst);
12153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, const Immediate& x) {
1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(5, dst, x);
1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(Register dst, const Operand& src) {
1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2B);
1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, Register src) {
1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x29);
1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Immediate& imm) {
12383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (imm.is_uint8()) {
12393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    test_b(reg, imm);
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This is not using emit_arith because test doesn't support
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // sign-extension of 8-bit operands.
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA9);
1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(imm);
1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Operand& op) {
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x85);
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1263e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::test_b(Register reg, const Operand& op) {
12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
1265e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1266e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x84);
1267e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(reg, op);
1268e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1269e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1270e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(const Operand& op, const Immediate& imm) {
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test(op.reg(), imm);
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
12763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (imm.is_uint8()) {
12773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return test_b(op, imm);
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm);
1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(Register reg, Immediate imm8) {
12863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm8.is_uint8());
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only use test against byte for registers that have a byte
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // variant: eax, ebx, ecx, and edx.
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA8);
12923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_b(imm8);
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (reg.is_byte_register()) {
12943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_arith_b(0xF6, 0xC0, reg, static_cast<uint8_t>(imm8.x_));
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
12963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0x66);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
12993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm8);
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(const Operand& op, Immediate imm8) {
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test_b(op.reg(), imm8);
13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return;
13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
13097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0xF6);
13107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_operand(eax, op);
13113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_b(imm8);
13123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
13143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, Immediate imm16) {
13153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm16.is_int16() || imm16.is_uint16());
13163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (reg.is(eax)) {
13183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xA9);
13193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm16);
13203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
13213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0x66);
13223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xF7);
13233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xc0 | reg.code());
13243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm16);
13253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
13267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
13277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
13283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, const Operand& op) {
13293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
13313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x85);
13323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
13333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
13353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(const Operand& op, Immediate imm16) {
13363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm16.is_int16() || imm16.is_uint16());
13373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (op.is_reg_only()) {
13383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    test_w(op.reg(), imm16);
13393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return;
13403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
13413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
13433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xF7);
13443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(eax, op);
13453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_w(imm16);
13463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, int32_t imm32) {
1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, Operand(dst), Immediate(imm32));
1351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, const Operand& src) {
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x33);
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::xor_(const Operand& dst, Register src) {
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x31);
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& dst, const Immediate& x) {
1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, dst, x);
1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bt(const Operand& dst, Register src) {
1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA3);
1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bts(const Operand& dst, Register src) {
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAB);
1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bsr(Register dst, const Operand& src) {
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xBD);
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bsf(Register dst, const Operand& src) {
1399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::hlt() {
1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF4);
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::int3() {
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xCC);
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::nop() {
1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90);
1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ret(int imm16) {
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint16(imm16));
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm16 == 0) {
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC3);
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC2);
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm16 & 0xFF);
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((imm16 >> 8) & 0xFF);
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::ud2() {
1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0B);
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Labels refer to positions in the (to be) generated code.
1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There are bound, linked, and unused labels.
1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Bound labels refer to known positions in the already
1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// generated code. pos() is the position the label refers to.
1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Linked labels refer to unknown positions in the code
1451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be generated; pos() is the position of the 32bit
1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Displacement of the last instruction using the label.
1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::print(Label* L) {
1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_unused()) {
1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unused label\n");
1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_bound()) {
1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("bound label to %d\n", L->pos());
1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_linked()) {
1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label l = *L;
1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unbound label");
1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    while (l.is_linked()) {
1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Displacement disp = disp_at(&l);
1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("@ %d ", l.pos());
1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.print();
1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("\n");
1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.next(&l);
1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("label in inconsistent state (pos = %d)\n", L->pos_);
1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind_to(Label* L, int pos) {
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= pos && pos <= pc_offset());  // must have a valid binding position
1479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (L->is_linked()) {
1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Displacement disp = disp_at(L);
1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int fixup_pos = L->pos();
1482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (disp.type() == Displacement::CODE_ABSOLUTE) {
1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      long_at_put(fixup_pos, reinterpret_cast<int>(buffer_ + pos));
1484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      internal_reference_positions_.push_back(fixup_pos);
1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else if (disp.type() == Displacement::CODE_RELATIVE) {
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Relative to Code* heap object pointer.
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag);
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (disp.type() == Displacement::UNCONDITIONAL_JUMP) {
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(byte_at(fixup_pos - 1) == 0xE9);  // jmp expected
1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
14923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Relative address, relative to point after address.
1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int imm32 = pos - (fixup_pos + sizeof(int32_t));
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, imm32);
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    disp.next(L);
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  while (L->is_near_linked()) {
1499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int fixup_pos = L->near_link_pos();
1500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int offset_to_next =
1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos)));
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offset_to_next <= 0);
1503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Relative address, relative to point after address.
1504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int disp = pos - fixup_pos - sizeof(int8_t);
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(0 <= disp && disp <= 127);
1506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_byte_at(fixup_pos, disp);
1507257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (offset_to_next < 0) {
1508257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->link_to(fixup_pos + offset_to_next, Label::kNear);
1509257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
1510257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->UnuseNear();
1511257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  L->bind_to(pos);
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind(Label* L) {
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!L->is_bound());  // label can only be bound once
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bind_to(L, pc_offset());
1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Label* L) {
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size = 5;
1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(offs - long_size);
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) {
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1553257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(const Operand& adr) {
1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call size is 1 (opcode) + adr.len_ (operand).
1555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 + adr.len_;
1556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(const Operand& adr) {
1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) {
1567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 /* EMIT */ + sizeof(uint32_t) /* emit */;
1568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::call(Handle<Code> code,
1572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     RelocInfo::Mode rmode,
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     TypeFeedbackId ast_id) {
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode)
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      || rmode == RelocInfo::CODE_AGE_SEQUENCE);
1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode, ast_id);
1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1582257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::jmp(Label* L, Label::Distance distance) {
1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 5;
1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
15903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1011 #8-bit disp.
1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xEB);
1592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
15943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1001 #32-bit disp.
1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xE9);
1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0xEB);
1600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
16023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1001 #32-bit disp.
1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE9);
1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(const Operand& adr) {
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) {
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode));
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode);
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) {
16370d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= cc && static_cast<int>(cc) < 16);
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 6;
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0111 tttn #8-bit disp
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x70 | cc);
1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0000 1111 1000 tttn #32-bit disp
1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x0F);
1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x80 | cc);
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0x70 | cc);
1656257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // 0000 1111 1000 tttn #32-bit disp
1659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Note: could eliminate cond. jumps to this jump if condition
1660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    //       is the same however, seems to be rather unlikely case.
1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x0F);
1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x80 | cc);
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) {
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= cc) && (static_cast<int>(cc) < 16));
16713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // 0000 1111 1000 tttn #32-bit disp.
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::j(Condition cc, Handle<Code> code, RelocInfo::Mode rmode) {
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 0000 1111 1000 tttn #32-bit disp
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit(code, rmode);
1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// FPU instructions.
1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld(int i) {
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC0, i);
1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1699402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fstp(int i) {
1700402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1701402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_farith(0xDD, 0xD8, i);
1702402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1703402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1704402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld1() {
1706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1712402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fldpi() {
1713402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1714402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xD9);
1715402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xEB);
1716402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1717402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1718402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fldz() {
1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xEE);
1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fldln2() {
1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xED);
1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_s(const Operand& adr) {
1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_d(const Operand& adr) {
1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_s(const Operand& adr) {
1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fst_s(const Operand& adr) {
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD9);
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, adr);
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_d(const Operand& adr) {
1762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1768402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fst_d(const Operand& adr) {
1769402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1770402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xDD);
1771402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_operand(edx, adr);
1772402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1773402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1774402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_s(const Operand& adr) {
1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_d(const Operand& adr) {
1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebp, adr);
1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_s(const Operand& adr) {
1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisttp_s(const Operand& adr) {
1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, adr);
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1804e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::fisttp_d(const Operand& adr) {
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1806e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1807e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xDD);
1808e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(ecx, adr);
1809e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1810e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1811e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fist_s(const Operand& adr) {
1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_d(const Operand& adr) {
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, adr);
1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fabs() {
1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE1);
1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fchs() {
1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcos() {
1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsin() {
1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fptan() {
18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF2);
18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fyl2x() {
1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xF1);
1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::f2xm1() {
18693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF0);
18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fscale() {
18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xFD);
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fninit() {
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xDB);
18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xE3);
18863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fadd(int i) {
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC0, i);
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd_i(int i) {
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC0, i);
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsub(int i) {
1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xE8, i);
1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsub_i(int i) {
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xE0, i);
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisub_s(const Operand& adr) {
1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmul_i(int i) {
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC8, i);
1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmul(int i) {
1927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC8, i);
1929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdiv(int i) {
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xF8, i);
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdiv_i(int i) {
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xF0, i);
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::faddp(int i) {
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC0, i);
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubp(int i) {
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE8, i);
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubrp(int i) {
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE0, i);
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmulp(int i) {
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC8, i);
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdivp(int i) {
1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xF8, i);
1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem() {
1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF8);
1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem1() {
1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF5);
1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fxch(int i) {
1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC8, i);
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fincstp() {
1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ffree(int i) {
2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xC0, i);
2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ftst() {
2008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE4);
2011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucomp(int i) {
2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xE8, i);
2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucompp() {
2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
2023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
2024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomi(int i) {
20283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
20293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDB);
20303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE8 + i);
20313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomip() {
20353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
20363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDF);
20373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE9);
20383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcompp() {
2042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDE);
2044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnstsw_ax() {
2049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
2051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
2052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fwait() {
2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9B);
2058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::frndint() {
2062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFC);
2065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnclex() {
2069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
2071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE2);
2072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sahf() {
2076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9E);
2078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::setcc(Condition cc, Register reg) {
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reg.is_byte_register());
2083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90 | cc);
2086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | reg.code());
2087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttss2si(Register dst, const Operand& src) {
2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF3);
2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttsd2si(Register dst, const Operand& src) {
2100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cvtsd2si(Register dst, XMMRegister src) {
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x2D);
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2117109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cvtsi2ss(XMMRegister dst, const Operand& src) {
2118109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
2119109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0xF3);
2120109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x0F);
2121109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x2A);
2122109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_sse_operand(dst, src);
2123109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
2124109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2125109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2A);
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtss2sd(XMMRegister dst, const Operand& src) {
21366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
21376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
21386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
21396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x5A);
21406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
21416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
21426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtsd2ss(XMMRegister dst, const Operand& src) {
214544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
214644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF2);
214744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
214844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x5A);
214944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
215044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
215144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
215244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addsd(XMMRegister dst, const Operand& src) {
2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58);
2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulsd(XMMRegister dst, const Operand& src) {
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x59);
2167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subsd(XMMRegister dst, const Operand& src) {
2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5C);
2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divsd(XMMRegister dst, const Operand& src) {
2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5E);
2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2189e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::xorpd(XMMRegister dst, XMMRegister src) {
2190e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2191e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2192e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2193e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x57);
2194e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2195e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2196e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2197e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::andps(XMMRegister dst, const Operand& src) {
2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x54);
2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orps(XMMRegister dst, const Operand& src) {
2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xorps(XMMRegister dst, const Operand& src) {
2215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EnsureSpace ensure_space(this);
2216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x0F);
2217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x57);
2218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  emit_sse_operand(dst, src);
2219257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addps(XMMRegister dst, const Operand& src) {
2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x58);
2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subps(XMMRegister dst, const Operand& src) {
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5C);
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulps(XMMRegister dst, const Operand& src) {
2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x59);
2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::divps(XMMRegister dst, const Operand& src) {
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5E);
2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sqrtsd(XMMRegister dst, const Operand& src) {
2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x51);
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22630d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::andpd(XMMRegister dst, XMMRegister src) {
22640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
22650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
22660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
22670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x54);
22680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
22690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orpd(XMMRegister dst, XMMRegister src) {
22736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
22746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
22756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
22776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
22786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
22796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) {
22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
22853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x2E);
22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_sse_operand(dst, src);
22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::roundss(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(SSE4_1));
2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x3A);
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0A);
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Mask precision exeption.
2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
230369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
230569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EnsureSpace ensure_space(this);
230669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x66);
230769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0F);
230869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x3A);
230969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0B);
231069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  emit_sse_operand(dst, src);
231169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Mask precision exeption.
231269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
231369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
231469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23166ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movmskpd(Register dst, XMMRegister src) {
23176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
23186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
23196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
23206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x50);
23216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
23226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
23236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movmskps(Register dst, XMMRegister src) {
2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x50);
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x76);
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckldq(XMMRegister dst, XMMRegister src) {
2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x62);
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckhdq(XMMRegister dst, XMMRegister src) {
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x6A);
2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxsd(XMMRegister dst, const Operand& src) {
2361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minsd(XMMRegister dst, const Operand& src) {
2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23780d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
23790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
23800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xF2);
23810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
23820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xC2);
23830d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
23840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(1);  // LT == 1
23850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
23860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23880d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movaps(XMMRegister dst, XMMRegister src) {
23890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
23900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
23910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x28);
23920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
23930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
23940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(XMMRegister dst, XMMRegister src) {
2396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x11);
2399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(dst, src);
2400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(XMMRegister dst, const Operand& src) {
2403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x10);
2406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(dst, src);
2407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(const Operand& dst, XMMRegister src) {
2410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x11);
2413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(src, dst);
2414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
24150d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC6);
2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(imm8);
2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24260d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movdqa(const Operand& dst, XMMRegister src) {
2427e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2428e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2429e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2430e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2431e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2432e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2433e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2434e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2435e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqa(XMMRegister dst, const Operand& src) {
2436e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2437e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2438e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2439e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2440e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2441e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2442e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2443e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2444e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(const Operand& dst, XMMRegister src ) {
2445e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2446e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2447e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2448e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2449e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2450e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2451e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2452e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2453e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(XMMRegister dst, const Operand& src) {
2454e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2455e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2456e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2457e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2458e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2459e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2460e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2461e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
24627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::prefetch(const Operand& src, int level) {
2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint2(level));
24647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
24657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x0F);
24667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x18);
2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Emit hint number in Reg position of RegR/M.
2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  XMMRegister code = XMMRegister::from_code(level);
24697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_sse_operand(code, src);
24707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
24717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
24727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
2473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(const Operand& dst, XMMRegister src ) {
2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x11);  // store
2478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(src, dst);
2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(XMMRegister dst, const Operand& src) {
2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x10);  // load
2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
249144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(const Operand& dst, XMMRegister src ) {
249244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
249344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
249444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
249544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x11);  // store
249644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(src, dst);
249744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
249844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
249944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
250044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(XMMRegister dst, const Operand& src) {
250144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
250244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
250344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
250444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x10);  // load
250544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
250644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
250744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
250844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25096ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movd(XMMRegister dst, const Operand& src) {
25106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x6E);
25146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::movd(const Operand& dst, XMMRegister src) {
2519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x7E);
2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
25303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
25313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
25323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
25333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x3A);
25343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x17);
2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(src, dst);
25363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(imm8);
25373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pand(XMMRegister dst, XMMRegister src) {
2541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xDB);
2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25496ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::pxor(XMMRegister dst, XMMRegister src) {
25506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xEF);
25546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::por(XMMRegister dst, XMMRegister src) {
2559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xEB);
2563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
25676ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ptest(XMMRegister dst, XMMRegister src) {
2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
25696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x38);
25736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x17);
25746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::pslld(XMMRegister reg, int8_t shift) {
2579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(esi, reg);  // esi == 6
2584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::psrld(XMMRegister reg, int8_t shift) {
2589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(edx, reg);  // edx == 2
2594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::psllq(XMMRegister reg, int8_t shift) {
25990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
26000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
26010d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
26020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x73);
26030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(esi, reg);  // esi == 6
2604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shift);
2605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psllq(XMMRegister dst, XMMRegister src) {
2609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xF3);
2613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2617b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister reg, int8_t shift) {
2618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x73);
2622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(edx, reg);  // edx == 2
2623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(shift);
2624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) {
2628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xD3);
2632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
2637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x70);
2641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shuffle);
2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) {
2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x3A);
2652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x16);
2653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(offset);
26551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
26561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) {
2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
26601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EnsureSpace ensure_space(this);
26611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x66);
26621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x0F);
26631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x3A);
26641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x22);
26651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  emit_sse_operand(dst, src);
26661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(offset);
26670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
26680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
26690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::addss(XMMRegister dst, const Operand& src) {
2671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x58);
2675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::subss(XMMRegister dst, const Operand& src) {
2680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5C);
2684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mulss(XMMRegister dst, const Operand& src) {
2689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x59);
2693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divss(XMMRegister dst, const Operand& src) {
2698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5E);
2702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::sqrtss(XMMRegister dst, const Operand& src) {
2707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x51);
2711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ucomiss(XMMRegister dst, const Operand& src) {
2716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0f);
2718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x2e);
2719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxss(XMMRegister dst, const Operand& src) {
2724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minss(XMMRegister dst, const Operand& src) {
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// AVX instructions
2742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
2743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW1);
2747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
2753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW0);
2757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vsd(byte op, XMMRegister dst, XMMRegister src1,
2763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                    const Operand& src2) {
2764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(AVX));
2765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, kF2, k0F, kWIG);
2767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vss(byte op, XMMRegister dst, XMMRegister src1,
2773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kLIG, kF3, k0F, kWIG);
2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vps(byte op, XMMRegister dst, XMMRegister src1,
2783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, kNone, k0F, kWIG);
2787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1,
2793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, k66, k0F, kWIG);
2797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi1(byte op, Register reg, Register vreg, const Operand& rm) {
2803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kNone, k0F38, kW0);
2806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::tzcnt(Register dst, const Operand& src) {
2812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
2817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::lzcnt(Register dst, const Operand& src) {
2822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(LZCNT));
2823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBD);
2827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::popcnt(Register dst, const Operand& src) {
2832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(POPCNT));
2833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xB8);
2837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi2(SIMDPrefix pp, byte op, Register reg, Register vreg,
2842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     const Operand& rm) {
2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, pp, k0F38, kW0);
2846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::rorx(Register dst, const Operand& src, byte imm8) {
2852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_uint8(imm8));
2854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register vreg = {0};  // VEX.vvvv unused
2855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kF2, k0F3A, kW0);
2857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF0);
2858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(imm8);
2860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
2864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { reg.code() };
2865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ireg, adr);
2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) {
2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28746ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) {
28756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
28766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
28776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) {
2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC0 | (dst.code() << 3) | src.code());
2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::emit_vex_prefix(XMMRegister vreg, VectorLength l, SIMDPrefix pp,
2885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                LeadingOpcode mm, VexW w) {
2886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (mm != k0F || w != kW0) {
2887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc4);
2888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Change RXB from "110" to "111" to align with gdb disassembler.
2889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EMIT(0xe0 | mm);
2890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(w | ((~vreg.code() & 0xf) << 3) | l | pp);
2891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
2892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc5);
2893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(((~vreg.code()) << 3) | l | pp);
2894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_vex_prefix(Register vreg, VectorLength l, SIMDPrefix pp,
2899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                LeadingOpcode mm, VexW w) {
2900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  XMMRegister ivreg = {vreg.code()};
2901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(ivreg, l, pp, mm, w);
2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GrowBuffer() {
2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer_overflow());
2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!own_buffer_) FATAL("external code buffer is too small");
2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Compute new buffer size.
2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CodeDesc desc;  // the new buffer
2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  desc.buffer_size = 2 * buffer_size_;
2912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Some internal data structures overflow for very large buffers,
2914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // they must ensure that kMaximalBufferSize is not too large.
2915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (desc.buffer_size > kMaximalBufferSize ||
2916c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      static_cast<size_t>(desc.buffer_size) >
2917c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate()->heap()->MaxOldGenerationSize()) {
2918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8::FatalProcessOutOfMemory("Assembler::GrowBuffer");
2919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up new buffer.
2922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.buffer = NewArray<byte>(desc.buffer_size);
2923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc.origin = this;
2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.instr_size = pc_offset();
2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos());
2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the buffer in debug mode. Use 'int3' instructions to make
2928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sure to get into problems if we ever run uninitialized code.
2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
2930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  memset(desc.buffer, 0xCC, desc.buffer_size);
2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy the data.
2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int pc_delta = desc.buffer - buffer_;
2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_);
2936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(desc.buffer, buffer_, desc.instr_size);
2937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(),
2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          desc.reloc_size);
2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Switch buffers.
2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeleteArray(buffer_);
2942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_ = desc.buffer;
2943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_size_ = desc.buffer_size;
2944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += pc_delta;
2945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
2946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               reloc_info_writer.last_pc() + pc_delta);
2947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Relocate internal references.
2949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto pos : internal_reference_positions_) {
2950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t* p = reinterpret_cast<int32_t*>(buffer_ + pos);
2951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *p += pc_delta;
2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!buffer_overflow());
2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(op1) && is_uint8(op2));  // wrong opcode
2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((op1 & 0x01) == 0);  // should be 8bit operation
2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op1);
2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op2 | dst.code());
2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(imm8);
2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) {
2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= sel) && (sel <= 7));
2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { sel };
2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x83);  // using a sign-extended 8-bit immediate.
2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_ & 0xFF);
2975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (dst.is_reg(eax)) {
2976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((sel << 3) | 0x05);  // short form if the destination is eax.
2977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x81);  // using a literal 32-bit immediate.
2980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_operand(Register reg, const Operand& adr) {
2987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const unsigned length = adr.len_;
2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length > 0);
2989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit updated ModRM byte containing the given register.
2991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3);
2992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit the rest of the encoded operand.
2994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i];
2995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += length;
2996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit relocation information if necessary.
2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) {
2999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pc_ -= sizeof(int32_t);  // pc_ must be *at* disp32
3000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    RecordRelocInfo(adr.rmode_);
3001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (adr.rmode_ == RelocInfo::INTERNAL_REFERENCE) {  // Fixup for labels
3002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      emit_label(*reinterpret_cast<Label**>(pc_));
3003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
3004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      pc_ += sizeof(int32_t);
3005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_label(Label* label) {
3011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (label->is_bound()) {
3012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    internal_reference_positions_.push_back(pc_offset());
3013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit(reinterpret_cast<uint32_t>(buffer_ + label->pos()));
3014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit_disp(label, Displacement::CODE_ABSOLUTE);
3016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_farith(int b1, int b2, int i) {
3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(b1) && is_uint8(b2));  // wrong opcode
3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= i &&  i < 8);  // illegal stack offset
3023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b1);
3024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b2 + i);
3025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::db(uint8_t data) {
3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
3030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(data);
3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::dd(uint32_t data) {
3035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(data);
3037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dq(uint64_t data) {
3041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
3042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_q(data);
3043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dd(Label* label) {
3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_label(label);
3050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsNone(rmode));
3055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Don't record external references unless the heap will be serialized.
3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !serializer_enabled() && !emit_debug_code()) {
3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
3059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RelocInfo rinfo(isolate(), pc_, rmode, data, NULL);
3061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Write(&rinfo);
3062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
3066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
3067f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
3068f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif  // V8_TARGET_ARCH_IA32
3069