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
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t RelocInfo::wasm_function_table_size_reference() {
20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsWasmFunctionTableSizeReference(rmode_));
20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return Memory::uint32_at(pc_);
20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid RelocInfo::unchecked_update_wasm_memory_reference(
21013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Address address, ICacheFlushMode flush_mode) {
21113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Memory::Address_at(pc_) = address;
21213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
21313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
21462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid RelocInfo::unchecked_update_wasm_size(uint32_t size,
21562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                           ICacheFlushMode flush_mode) {
21613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Memory::uint32_at(pc_) = size;
217bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation of Operand
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) {
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [base + disp/r]
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base]
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, base);
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp8]
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, base);
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + disp/r]
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, base);
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (base.is(esp)) set_sib(times_1, esp, base);
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register base,
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 Register index,
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 ScaleFactor scale,
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 int32_t disp,
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 RelocInfo::Mode rmode) {
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!index.is(esp));  // illegal addressing mode
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [base + index*scale + disp/r]
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (disp == 0 && RelocInfo::IsNone(rmode) && !base.is(ebp)) {
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale]
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(0, esp);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_int8(disp) && RelocInfo::IsNone(rmode)) {
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp8]
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(1, esp);
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_disp8(disp);
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // [base + index*scale + disp/r]
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_modrm(2, esp);
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_sib(scale, index, base);
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_dispr(disp, rmode);
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockOperand::Operand(Register index,
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 ScaleFactor scale,
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 int32_t disp,
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 RelocInfo::Mode rmode) {
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!index.is(esp));  // illegal addressing mode
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // [index*scale + disp/r]
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_modrm(0, esp);
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_sib(scale, index, ebp);
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_dispr(disp, rmode);
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Operand::is_reg(Register reg) const {
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((buf_[0] & 0xF8) == 0xC0)  // addressing mode is register only.
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && ((buf_[0] & 0x07) == reg.code());  // register codes match.
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Operand::is_reg_only() const {
2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (buf_[0] & 0xF8) == 0xC0;  // Addressing mode is register only.
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRegister Operand::reg() const {
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_reg_only());
2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Register::from_code(buf_[0] & 0x07);
2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -----------------------------------------------------------------------------
2973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Implementation of Assembler.
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Emit a single byte. Must always be inlined.
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define EMIT(x)                                 \
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *pc_++ = (x)
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAssembler::Assembler(Isolate* isolate, void* buffer, int buffer_size)
304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    : AssemblerBase(isolate, buffer, buffer_size) {
305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Clear the buffer in debug mode unless it was provided by the
306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// caller in which case we can't be sure it's okay to overwrite
307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// existing code in it; see CodePatcher::CodePatcher(...).
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (own_buffer_) {
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    memset(buffer_, 0xCC, buffer_size_);  // int3
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GetCode(CodeDesc* desc) {
3193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Finalize code (at this point overflow() may be true, but the gap ensures
3203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // that we are still not overlapping instructions and relocation info).
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(pc_ <= reloc_info_writer.pos());  // No overlap.
3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up code descriptor.
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer = buffer_;
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->buffer_size = buffer_size_;
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->instr_size = pc_offset();
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->origin = this;
328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc->constant_pool_size = 0;
32913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  desc->unwinding_info_size = 0;
33013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  desc->unwinding_info = nullptr;
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::Align(int m) {
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(base::bits::IsPowerOfTwo32(m));
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int mask = m - 1;
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int addr = pc_offset();
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Nop((m - (addr & mask)) & mask);
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Assembler::IsNop(Address addr) {
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address a = addr;
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (*a == 0x66) a++;
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (*a == 0x90) return true;
3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (a[0] == 0xf && a[1] == 0x1f) return true;
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return false;
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::Nop(int bytes) {
3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (bytes > 0) {
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    switch (bytes) {
3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 2:
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 1:
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x90);
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 3:
3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 4:
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x40);
3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 6:
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 5:
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x44);
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 7:
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x80);
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return;
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      default:
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 11:
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 10:
3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 9:
3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x66);
4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes--;
4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case 8:
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0xf);
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x1f);
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0x84);
4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        EMIT(0);
4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bytes -= 8;
4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4169dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenvoid Assembler::CodeTargetAlign() {
4179dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Align(16);  // Preferred alignment of jump targets on ia32.
4189dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen}
4199dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
4209dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cpuid() {
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA2);
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushad() {
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x60);
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popad() {
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x61);
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pushfd() {
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9C);
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::popfd() {
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9D);
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Immediate& x) {
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6a);
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_);
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x68);
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::push_imm32(int32_t imm32) {
465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x68);
467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(imm32);
468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(Register src) {
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x50 | src.code());
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::push(const Operand& src) {
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esi, src);
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(Register dst) {
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58 | dst.code());
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::pop(const Operand& dst) {
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8F);
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::enter(const Immediate& size) {
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8);
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(size);
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0);
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::leave() {
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC9);
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(Register dst, const Operand& src) {
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8A);
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_b(const Operand& dst, const Immediate& src) {
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC6);
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_));
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_b(const Operand& dst, Register src) {
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(src.is_byte_register());
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x88);
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(Register dst, const Operand& src) {
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov_w(const Operand& dst, Register src) {
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mov_w(const Operand& dst, const Immediate& src) {
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC7);
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(eax, dst);
557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ & 0xff));
558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(static_cast<int8_t>(src.x_ >> 8));
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, int32_t imm32) {
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm32);
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Immediate& x) {
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Handle<Object> handle) {
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB8 | dst.code());
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, const Operand& src) {
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8B);
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(Register dst, Register src) {
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | src.code() << 3 | dst.code());
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, const Immediate& x) {
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(x);
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Handle<Object> handle) {
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC7);
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(handle);
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mov(const Operand& dst, Register src) {
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x89);
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_b(Register dst, const Operand& src) {
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBE);
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsx_w(Register dst, const Operand& src) {
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xBF);
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_b(Register dst, const Operand& src) {
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB6);
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movzx_w(Register dst, const Operand& src) {
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xB7);
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmov(Condition cc, Register dst, const Operand& src) {
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Opcode: 0f 40 + cc /r.
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 + cc);
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6616ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::cld() {
6626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xFC);
6646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
667e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::rep_movs() {
668e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
669e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
670e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xA5);
671e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
672e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
673e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
6746ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::rep_stos() {
6756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
6766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
6776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xAB);
6786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
681f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarkevoid Assembler::stos() {
682f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EnsureSpace ensure_space(this);
683f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  EMIT(0xAB);
684f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
685f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
686f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xchg(Register dst, Register src) {
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
6893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (src.is(eax) || dst.is(eax)) {  // Single-byte encoding.
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x90 | (src.is(eax) ? dst.code() : src.code()));
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x87);
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC0 | src.code() << 3 | dst.code());
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xchg(Register dst, const Operand& src) {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x87);
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_b(Register reg, const Operand& op) {
705bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EnsureSpace ensure_space(this);
706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x86);
707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  emit_operand(reg, op);
708bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Assembler::xchg_w(Register reg, const Operand& op) {
711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EnsureSpace ensure_space(this);
712bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x66);
713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x87);
714bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  emit_operand(reg, op);
715bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::lock() {
71813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
71913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xF0);
72013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
72113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
72213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg(const Operand& dst, Register src) {
72313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
72413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
72513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB1);
72613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
72713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
72813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
72913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_b(const Operand& dst, Register src) {
73013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
73113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
73213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB0);
73313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
73413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
73513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
73613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Assembler::cmpxchg_w(const Operand& dst, Register src) {
73713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EnsureSpace ensure_space(this);
73813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x66);
73913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0x0F);
74013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  EMIT(0xB1);
74113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  emit_operand(src, dst);
74213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
74313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, int32_t imm32) {
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(2, Operand(dst), Immediate(imm32));
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::adc(Register dst, const Operand& src) {
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x13);
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(Register dst, const Operand& src) {
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x03);
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::add(const Operand& dst, Register src) {
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x01);
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::add(const Operand& dst, const Immediate& x) {
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reloc_info_writer.last_pc() != NULL);
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(0, dst, x);
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, int32_t imm32) {
77959151504615d929945dc59db37bf1166937748c6Steve Block  and_(dst, Immediate(imm32));
78059151504615d929945dc59db37bf1166937748c6Steve Block}
78159151504615d929945dc59db37bf1166937748c6Steve Block
78259151504615d929945dc59db37bf1166937748c6Steve Block
78359151504615d929945dc59db37bf1166937748c6Steve Blockvoid Assembler::and_(Register dst, const Immediate& x) {
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
78559151504615d929945dc59db37bf1166937748c6Steve Block  emit_arith(4, Operand(dst), x);
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(Register dst, const Operand& src) {
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x23);
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, const Immediate& x) {
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(4, dst, x);
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::and_(const Operand& dst, Register src) {
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x21);
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpb(const Operand& op, Immediate imm8) {
8093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm8.is_int8() || imm8.is_uint8());
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op.is_reg(eax)) {
8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x3C);
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    EMIT(0x80);
8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    emit_operand(edi, op);  // edi == 7
8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_b(imm8);
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(const Operand& op, Register reg) {
8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
823d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
824d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x38);
8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
826d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
827d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
828d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::cmpb(Register reg, const Operand& op) {
8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
831d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EnsureSpace ensure_space(this);
832d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke  EMIT(0x3A);
8333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(reg, op);
834d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke}
835d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
836d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw(const Operand& op, Immediate imm16) {
83862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(imm16.is_int16() || imm16.is_uint16());
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x81);
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, op);
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_w(imm16);
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(Register reg, const Operand& op) {
8473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
8483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
849bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x3B);
8503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
8513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
8523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::cmpw(const Operand& op, Register reg) {
8543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
8553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
856bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  EMIT(0x39);
8573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
8583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, int32_t imm32) {
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(imm32));
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, Handle<Object> handle) {
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, Operand(reg), Immediate(handle));
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(Register reg, const Operand& op) {
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x3B);
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
878109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cmp(const Operand& op, Register reg) {
879109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
880109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x39);
881109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_operand(reg, op);
882109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, const Immediate& imm) {
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, imm);
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmp(const Operand& op, Handle<Object> handle) {
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(7, op, Immediate(handle));
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpb_al(const Operand& op) {
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x38);  // CMP r/m8, r8
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register al.
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cmpw_ax(const Operand& op) {
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x66);
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x39);  // CMP r/m16, r16
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);  // eax has same code as register ax.
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec_b(Register dst) {
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(dst.is_byte_register());
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC8 | dst.code());
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9190d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::dec_b(const Operand& dst) {
9200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
9210d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xFE);
9220d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_operand(ecx, dst);
9230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
9240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
9250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(Register dst) {
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x48 | dst.code());
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::dec(const Operand& dst) {
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, dst);
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cdq() {
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x99);
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::idiv(const Operand& src) {
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, src);
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::div(const Operand& src) {
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esi, src);
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register reg) {
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8 | reg.code());
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, const Operand& src) {
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAF);
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::imul(Register dst, Register src, int32_t imm32) {
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  imul(dst, Operand(src), imm32);
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::imul(Register dst, const Operand& src, int32_t imm32) {
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_int8(imm32)) {
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x6B);
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm32);
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x69);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(dst, src);
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(imm32);
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(Register dst) {
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x40 | dst.code());
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::inc(const Operand& dst) {
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, dst);
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::lea(Register dst, const Operand& src) {
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x8D);
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::mul(Register src) {
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0 | src.code());
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::neg(Register dst) {
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD8 | dst.code());
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::neg(const Operand& dst) {
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebx, dst);
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::not_(Register dst) {
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD0 | dst.code());
1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::not_(const Operand& dst) {
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF7);
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, dst);
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, int32_t imm32) {
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, Operand(dst), Immediate(imm32));
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(Register dst, const Operand& src) {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0B);
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, const Immediate& x) {
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(1, dst, x);
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::or_(const Operand& dst, Register src) {
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x09);
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::rcl(Register dst, uint8_t imm8) {
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD0 | dst.code());
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1088756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Assembler::rcr(Register dst, uint8_t imm8) {
1089756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  EnsureSpace ensure_space(this);
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1091756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (imm8 == 1) {
1092756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD1);
1093756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1094756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  } else {
1095756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xC1);
1096756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(0xD8 | dst.code());
1097756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    EMIT(imm8);
1098756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
1099756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1100756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1101756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror(const Operand& dst, uint8_t imm8) {
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (imm8 == 1) {
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xD1);
1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC1);
1110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    emit_operand(ecx, dst);
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(imm8);
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ror_cl(const Operand& dst) {
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD3);
1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_operand(ecx, dst);
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar(const Operand& dst, uint8_t imm8) {
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(edi, dst);
1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sar_cl(const Operand& dst) {
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edi, dst);
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sbb(Register dst, const Operand& src) {
1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x1B);
1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld(Register dst, Register src, uint8_t shift) {
11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(is_uint5(shift));
11513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
11523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
11533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xA4);
11543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, Operand(dst));
11553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(shift);
11563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shld_cl(Register dst, Register src) {
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA5);
11623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, Operand(dst));
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl(const Operand& dst, uint8_t imm8) {
1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm8 == 1) {
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xD1);
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC1);
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(esp, dst);
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm8);
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shl_cl(const Operand& dst) {
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD3);
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(esp, dst);
1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr(const Operand& dst, uint8_t imm8) {
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint5(imm8));  // illegal shift count
1189d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (imm8 == 1) {
1190d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xD1);
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1192d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  } else {
1193d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(0xC1);
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit_operand(ebp, dst);
1195d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    EMIT(imm8);
1196d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
1197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shr_cl(const Operand& dst) {
1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1202d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  EMIT(0xD3);
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(ebp, dst);
1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd(Register dst, Register src, uint8_t shift) {
12073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(is_uint5(shift));
12083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
12093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
12103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xAC);
12113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(dst, Operand(src));
12123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(shift);
12133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
12143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
12153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::shrd_cl(const Operand& dst, Register src) {
12163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
12173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x0F);
12183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xAD);
12193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(src, dst);
12203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, const Immediate& x) {
1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(5, dst, x);
1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(Register dst, const Operand& src) {
1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2B);
1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sub(const Operand& dst, Register src) {
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x29);
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Immediate& imm) {
12433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (imm.is_uint8()) {
12443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    test_b(reg, imm);
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This is not using emit_arith because test doesn't support
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // sign-extension of 8-bit operands.
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA9);
1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(imm);
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(Register reg, const Operand& op) {
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x85);
1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(reg, op);
1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1268e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::test_b(Register reg, const Operand& op) {
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(reg.is_byte_register());
1270e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1271e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x84);
1272e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(reg, op);
1273e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1274e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1275e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::test(const Operand& op, const Immediate& imm) {
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test(op.reg(), imm);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
12813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (imm.is_uint8()) {
12823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return test_b(op, imm);
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, op);
1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit(imm);
1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(Register reg, Immediate imm8) {
12913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm8.is_uint8());
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only use test against byte for registers that have a byte
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // variant: eax, ebx, ecx, and edx.
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (reg.is(eax)) {
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xA8);
12973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_b(imm8);
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (reg.is_byte_register()) {
12993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_arith_b(0xF6, 0xC0, reg, static_cast<uint8_t>(imm8.x_));
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
13013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0x66);
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xF7);
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EMIT(0xC0 | reg.code());
13043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm8);
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_b(const Operand& op, Immediate imm8) {
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op.is_reg_only()) {
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    test_b(op.reg(), imm8);
13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return;
13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
13147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0xF6);
13157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_operand(eax, op);
13163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_b(imm8);
13173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
13193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, Immediate imm16) {
13203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm16.is_int16() || imm16.is_uint16());
13213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (reg.is(eax)) {
13233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xA9);
13243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm16);
13253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
13263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0x66);
13273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xF7);
13283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    EMIT(0xc0 | reg.code());
13293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    emit_w(imm16);
13303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
13317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
13327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
13333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(Register reg, const Operand& op) {
13343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
13363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x85);
13373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(reg, op);
13383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
13403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Assembler::test_w(const Operand& op, Immediate imm16) {
13413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(imm16.is_int16() || imm16.is_uint16());
13423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (op.is_reg_only()) {
13433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    test_w(op.reg(), imm16);
13443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return;
13453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
13463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EnsureSpace ensure_space(this);
13473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0x66);
13483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  EMIT(0xF7);
13493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_operand(eax, op);
13503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  emit_w(imm16);
13513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
13527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, int32_t imm32) {
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, Operand(dst), Immediate(imm32));
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(Register dst, const Operand& src) {
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x33);
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::xor_(const Operand& dst, Register src) {
1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x31);
13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_operand(src, dst);
1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::xor_(const Operand& dst, const Immediate& x) {
1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_arith(6, dst, x);
1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bt(const Operand& dst, Register src) {
1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xA3);
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bts(const Operand& dst, Register src) {
1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xAB);
1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(src, dst);
1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::bsr(Register dst, const Operand& src) {
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xBD);
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(dst, src);
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bsf(Register dst, const Operand& src) {
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::hlt() {
1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF4);
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::int3() {
1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xCC);
1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::nop() {
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90);
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ret(int imm16) {
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint16(imm16));
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (imm16 == 0) {
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC3);
1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xC2);
1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(imm16 & 0xFF);
1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((imm16 >> 8) & 0xFF);
1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::ud2() {
1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0B);
1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Labels refer to positions in the (to be) generated code.
1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// There are bound, linked, and unused labels.
1451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Bound labels refer to known positions in the already
1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// generated code. pos() is the position the label refers to.
1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Linked labels refer to unknown positions in the code
1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be generated; pos() is the position of the 32bit
1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Displacement of the last instruction using the label.
1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::print(Label* L) {
1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_unused()) {
1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unused label\n");
1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_bound()) {
1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("bound label to %d\n", L->pos());
1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (L->is_linked()) {
1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label l = *L;
1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("unbound label");
1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    while (l.is_linked()) {
1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Displacement disp = disp_at(&l);
1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("@ %d ", l.pos());
1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.print();
1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintF("\n");
1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      disp.next(&l);
1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("label in inconsistent state (pos = %d)\n", L->pos_);
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind_to(Label* L, int pos) {
1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= pos && pos <= pc_offset());  // must have a valid binding position
1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (L->is_linked()) {
1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Displacement disp = disp_at(L);
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int fixup_pos = L->pos();
1487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (disp.type() == Displacement::CODE_ABSOLUTE) {
1488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      long_at_put(fixup_pos, reinterpret_cast<int>(buffer_ + pos));
1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      internal_reference_positions_.push_back(fixup_pos);
1490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else if (disp.type() == Displacement::CODE_RELATIVE) {
1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Relative to Code* heap object pointer.
1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, pos + Code::kHeaderSize - kHeapObjectTag);
1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (disp.type() == Displacement::UNCONDITIONAL_JUMP) {
1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(byte_at(fixup_pos - 1) == 0xE9);  // jmp expected
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
14973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // Relative address, relative to point after address.
1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int imm32 = pos - (fixup_pos + sizeof(int32_t));
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      long_at_put(fixup_pos, imm32);
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    disp.next(L);
1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  while (L->is_near_linked()) {
1504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int fixup_pos = L->near_link_pos();
1505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int offset_to_next =
1506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        static_cast<int>(*reinterpret_cast<int8_t*>(addr_at(fixup_pos)));
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offset_to_next <= 0);
1508257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Relative address, relative to point after address.
1509257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    int disp = pos - fixup_pos - sizeof(int8_t);
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(0 <= disp && disp <= 127);
1511257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_byte_at(fixup_pos, disp);
1512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (offset_to_next < 0) {
1513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->link_to(fixup_pos + offset_to_next, Label::kNear);
1514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
1515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      L->UnuseNear();
1516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  L->bind_to(pos);
1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::bind(Label* L) {
1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!L->is_bound());  // label can only be bound once
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bind_to(L, pc_offset());
1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(Label* L) {
1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size = 5;
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(offs - long_size);
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
15393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1000 #32-bit disp.
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE8);
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(byte* entry, RelocInfo::Mode rmode) {
1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(const Operand& adr) {
1559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call size is 1 (opcode) + adr.len_ (operand).
1560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 + adr.len_;
1561257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::call(const Operand& adr) {
1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Assembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) {
1572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return 1 /* EMIT */ + sizeof(uint32_t) /* emit */;
1573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1576257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::call(Handle<Code> code,
1577257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     RelocInfo::Mode rmode,
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     TypeFeedbackId ast_id) {
1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode)
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      || rmode == RelocInfo::CODE_AGE_SEQUENCE);
1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode, ast_id);
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::jmp(Label* L, Label::Distance distance) {
1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 5;
1592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
15953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1011 #8-bit disp.
1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xEB);
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
15993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      // 1110 1001 #32-bit disp.
1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0xE9);
1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0xEB);
1605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
16073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    // 1110 1001 #32-bit disp.
1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0xE9);
1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsCodeTarget(rmode));
1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(const Operand& adr) {
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) {
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(RelocInfo::IsCodeTarget(rmode));
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit(code, rmode);
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1641257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, Label* L, Label::Distance distance) {
16420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= cc && static_cast<int>(cc) < 16);
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (L->is_bound()) {
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int short_size = 2;
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int long_size  = 6;
1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offs = L->pos() - pc_offset();
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(offs <= 0);
1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (is_int8(offs - short_size)) {
1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0111 tttn #8-bit disp
1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x70 | cc);
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT((offs - short_size) & 0xFF);
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0000 1111 1000 tttn #32-bit disp
1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x0F);
1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      EMIT(0x80 | cc);
1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      emit(offs - long_size);
1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1659257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (distance == Label::kNear) {
1660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    EMIT(0x70 | cc);
1661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    emit_near_disp(L);
1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // 0000 1111 1000 tttn #32-bit disp
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Note: could eliminate cond. jumps to this jump if condition
1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    //       is the same however, seems to be rather unlikely case.
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x0F);
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x80 | cc);
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_disp(L, Displacement::OTHER);
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) {
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= cc) && (static_cast<int>(cc) < 16));
16763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // 0000 1111 1000 tttn #32-bit disp.
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (RelocInfo::IsRuntimeEntry(rmode)) {
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(reinterpret_cast<uint32_t>(entry), rmode);
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    emit(entry - (pc_ + sizeof(int32_t)), rmode);
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::j(Condition cc, Handle<Code> code, RelocInfo::Mode rmode) {
1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // 0000 1111 1000 tttn #32-bit disp
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x80 | cc);
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit(code, rmode);
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// FPU instructions.
1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld(int i) {
1699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC0, i);
1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1704402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fstp(int i) {
1705402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1706402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_farith(0xDD, 0xD8, i);
1707402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1708402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1709402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld1() {
1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE8);
1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1717402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fldpi() {
1718402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1719402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xD9);
1720402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xEB);
1721402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1722402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1723402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fldz() {
1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xEE);
1728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fldln2() {
1732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xED);
1735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_s(const Operand& adr) {
1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fld_d(const Operand& adr) {
1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_s(const Operand& adr) {
1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fst_s(const Operand& adr) {
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xD9);
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_operand(edx, adr);
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fstp_d(const Operand& adr) {
1767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDD);
1769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1773402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescuvoid Assembler::fst_d(const Operand& adr) {
1774402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EnsureSpace ensure_space(this);
1775402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  EMIT(0xDD);
1776402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  emit_operand(edx, adr);
1777402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu}
1778402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1779402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_s(const Operand& adr) {
1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(eax, adr);
1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fild_d(const Operand& adr) {
1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebp, adr);
1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_s(const Operand& adr) {
1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ebx, adr);
1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisttp_s(const Operand& adr) {
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ecx, adr);
1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1809e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::fisttp_d(const Operand& adr) {
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE3));
1811e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
1812e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xDD);
1813e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_operand(ecx, adr);
1814e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1815e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1816e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fist_s(const Operand& adr) {
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edx, adr);
1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fistp_d(const Operand& adr) {
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(edi, adr);
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fabs() {
1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE1);
1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fchs() {
1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcos() {
1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFF);
1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsin() {
1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFE);
1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fptan() {
18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF2);
18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::fyl2x() {
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
1868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xD9);
1869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xF1);
1870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::f2xm1() {
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xF0);
18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fscale() {
18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xD9);
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xFD);
18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::fninit() {
18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xDB);
18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0xE3);
18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fadd(int i) {
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC0, i);
1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fadd_i(int i) {
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC0, i);
1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsub(int i) {
1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xE8, i);
1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fsub_i(int i) {
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xE0, i);
1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fisub_s(const Operand& adr) {
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(esp, adr);
1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fmul_i(int i) {
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xC8, i);
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmul(int i) {
1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xC8, i);
1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdiv(int i) {
1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDC, 0xF8, i);
1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::fdiv_i(int i) {
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_farith(0xD8, 0xF0, i);
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::faddp(int i) {
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC0, i);
1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubp(int i) {
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE8, i);
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fsubrp(int i) {
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xE0, i);
1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fmulp(int i) {
1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xC8, i);
1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fdivp(int i) {
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDE, 0xF8, i);
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem() {
1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF8);
1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fprem1() {
1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF5);
1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fxch(int i) {
1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xD9, 0xC8, i);
1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fincstp() {
2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF7);
2003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ffree(int i) {
2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xC0, i);
2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::ftst() {
2013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE4);
2016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucomp(int i) {
2020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_farith(0xDD, 0xE8, i);
2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fucompp() {
2026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDA);
2028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE9);
2029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomi(int i) {
20333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
20343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDB);
20353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE8 + i);
20363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid Assembler::fucomip() {
20403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EnsureSpace ensure_space(this);
20413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xDF);
20423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  EMIT(0xE9);
20433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fcompp() {
2047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDE);
2049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnstsw_ax() {
2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDF);
2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE0);
2057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fwait() {
2061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9B);
2063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::frndint() {
2067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xD9);
2069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xFC);
2070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::fnclex() {
2074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xDB);
2076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xE2);
2077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::sahf() {
2081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x9E);
2083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::setcc(Condition cc, Register reg) {
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reg.is_byte_register());
2088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x90 | cc);
2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | reg.code());
2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttss2si(Register dst, const Operand& src) {
2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF3);
2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
2100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvttsd2si(Register dst, const Operand& src) {
2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2C);
2109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(dst, src);
2110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::cvtsd2si(Register dst, XMMRegister src) {
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x2D);
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2122109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Assembler::cvtsi2ss(XMMRegister dst, const Operand& src) {
2123109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EnsureSpace ensure_space(this);
2124109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0xF3);
2125109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x0F);
2126109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  EMIT(0x2A);
2127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  emit_sse_operand(dst, src);
2128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
2129109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2130109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x2A);
2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtss2sd(XMMRegister dst, const Operand& src) {
21416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
21426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xF3);
21436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
21446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x5A);
21456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
21466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
21476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::cvtsd2ss(XMMRegister dst, const Operand& src) {
215044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
215144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF2);
215244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
215344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x5A);
215444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
215544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
215644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
215744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addsd(XMMRegister dst, const Operand& src) {
2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x58);
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulsd(XMMRegister dst, const Operand& src) {
2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x59);
2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subsd(XMMRegister dst, const Operand& src) {
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5C);
2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divsd(XMMRegister dst, const Operand& src) {
2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);
2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x5E);
2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2194e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::xorpd(XMMRegister dst, XMMRegister src) {
2195e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2196e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2197e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2198e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x57);
2199e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2200e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2201e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2202e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::andps(XMMRegister dst, const Operand& src) {
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x54);
2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orps(XMMRegister dst, const Operand& src) {
2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::xorps(XMMRegister dst, const Operand& src) {
2220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EnsureSpace ensure_space(this);
2221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x0F);
2222257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  EMIT(0x57);
2223257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  emit_sse_operand(dst, src);
2224257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2225257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2226257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::addps(XMMRegister dst, const Operand& src) {
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x58);
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::subps(XMMRegister dst, const Operand& src) {
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5C);
2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::mulps(XMMRegister dst, const Operand& src) {
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x59);
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::divps(XMMRegister dst, const Operand& src) {
2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x5E);
2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::sqrtsd(XMMRegister dst, const Operand& src) {
2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xF2);
2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x51);
2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22680d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::andpd(XMMRegister dst, XMMRegister src) {
22690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
22700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
22710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
22720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x54);
22730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
22740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22750d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::orpd(XMMRegister dst, XMMRegister src) {
22786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
22796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
22806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x56);
22826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
22836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
22846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::ucomisd(XMMRegister dst, const Operand& src) {
22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x2E);
22913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  emit_sse_operand(dst, src);
22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::roundss(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(SSE4_1));
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x3A);
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0A);
2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Mask precision exeption.
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
230869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) {
2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
231069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EnsureSpace ensure_space(this);
231169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x66);
231269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0F);
231369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x3A);
231469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(0x0B);
231569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  emit_sse_operand(dst, src);
231669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Mask precision exeption.
231769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  EMIT(static_cast<byte>(mode) | 0x8);
231869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
231969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23216ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movmskpd(Register dst, XMMRegister src) {
23226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
23236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
23246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
23256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x50);
23266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
23276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
23286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::movmskps(Register dst, XMMRegister src) {
2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x50);
2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) {
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x66);
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x76);
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckldq(XMMRegister dst, XMMRegister src) {
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x62);
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::punpckhdq(XMMRegister dst, XMMRegister src) {
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x66);
2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x6A);
2361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxsd(XMMRegister dst, const Operand& src) {
2366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minsd(XMMRegister dst, const Operand& src) {
2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF2);
2377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23830d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
23840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
23850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xF2);
23860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
23870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0xC2);
23880d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
23890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(1);  // LT == 1
23900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
23910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23930d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movaps(XMMRegister dst, XMMRegister src) {
23940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
23950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
23960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x28);
23970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(dst, src);
23980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
23990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(XMMRegister dst, XMMRegister src) {
2401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x11);
2404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(dst, src);
2405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(XMMRegister dst, const Operand& src) {
2408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x10);
2411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(dst, src);
2412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Assembler::movups(const Operand& dst, XMMRegister src) {
2415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureSpace ensure_space(this);
2416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x0F);
2417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EMIT(0x11);
2418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  emit_sse_operand(src, dst);
2419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
24200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureSpace ensure_space(this);
2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0x0F);
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC6);
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(dst, src);
2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(imm8);
2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24310d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Assembler::movdqa(const Operand& dst, XMMRegister src) {
2432e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2433e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2434e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2435e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2436e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2437e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2438e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2439e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2440e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqa(XMMRegister dst, const Operand& src) {
2441e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2442e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x66);
2443e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2444e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2445e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2446e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2447e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2448e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2449e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(const Operand& dst, XMMRegister src ) {
2450e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2451e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2452e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2453e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x7F);
2454e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(src, dst);
2455e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2456e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2457e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2458e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid Assembler::movdqu(XMMRegister dst, const Operand& src) {
2459e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EnsureSpace ensure_space(this);
2460e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0xF3);
2461e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x0F);
2462e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  EMIT(0x6F);
2463e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  emit_sse_operand(dst, src);
2464e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
2465e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2466e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
24677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid Assembler::prefetch(const Operand& src, int level) {
2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint2(level));
24697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EnsureSpace ensure_space(this);
24707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x0F);
24717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  EMIT(0x18);
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Emit hint number in Reg position of RegR/M.
2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  XMMRegister code = XMMRegister::from_code(level);
24747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  emit_sse_operand(code, src);
24757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
24767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
24777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
2478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(const Operand& dst, XMMRegister src ) {
2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x11);  // store
2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(src, dst);
2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::movsd(XMMRegister dst, const Operand& src) {
2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xF2);  // double
2490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x0F);
2491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0x10);  // load
2492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_sse_operand(dst, src);
2493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
249644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(const Operand& dst, XMMRegister src ) {
249744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
249844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
249944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
250044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x11);  // store
250144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(src, dst);
250244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
250344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
250444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
250544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Assembler::movss(XMMRegister dst, const Operand& src) {
250644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EnsureSpace ensure_space(this);
250744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0xF3);  // float
250844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x0F);
250944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EMIT(0x10);  // load
251044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  emit_sse_operand(dst, src);
251144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
251244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
251344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25146ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::movd(XMMRegister dst, const Operand& src) {
25156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x6E);
25196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::movd(const Operand& dst, XMMRegister src) {
2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x7E);
2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
25353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EnsureSpace ensure_space(this);
25363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x66);
25373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x0F);
25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x3A);
25393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(0x17);
2540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  emit_sse_operand(src, dst);
25413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EMIT(imm8);
25423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
25433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pand(XMMRegister dst, XMMRegister src) {
2546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0xDB);
2550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::pxor(XMMRegister dst, XMMRegister src) {
25556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xEF);
25596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::por(XMMRegister dst, XMMRegister src) {
2564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xEB);
2568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2570b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2571b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
25726ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::ptest(XMMRegister dst, XMMRegister src) {
2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
25746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EnsureSpace ensure_space(this);
25756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x66);
25766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x0F);
25776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x38);
25786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0x17);
25796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  emit_sse_operand(dst, src);
25806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::pslld(XMMRegister reg, int8_t shift) {
2584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(esi, reg);  // esi == 6
2589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::psrld(XMMRegister reg, int8_t shift) {
2594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x66);
2596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x72);
2598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(edx, reg);  // edx == 2
2599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(shift);
2600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::psllq(XMMRegister reg, int8_t shift) {
26040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EnsureSpace ensure_space(this);
26050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x66);
26060d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x0F);
26070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  EMIT(0x73);
26080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  emit_sse_operand(esi, reg);  // esi == 6
2609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shift);
2610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psllq(XMMRegister dst, XMMRegister src) {
2614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2617b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xF3);
2618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister reg, int8_t shift) {
2623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x73);
2627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(edx, reg);  // edx == 2
2628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(shift);
2629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid Assembler::psrlq(XMMRegister dst, XMMRegister src) {
2633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EnsureSpace ensure_space(this);
2634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x66);
2635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0x0F);
2636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  EMIT(0xD3);
2637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  emit_sse_operand(dst, src);
2638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x70);
2646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(dst, src);
2647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(shuffle);
2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) {
2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
2653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
2654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x66);
2655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x0F);
2656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x3A);
2657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(0x16);
2658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit_sse_operand(src, dst);
2659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(offset);
26601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
26611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) {
2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsEnabled(SSE4_1));
26651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EnsureSpace ensure_space(this);
26661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x66);
26671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x0F);
26681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x3A);
26691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(0x22);
26701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  emit_sse_operand(dst, src);
26711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  EMIT(offset);
26720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
26730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
26740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::addss(XMMRegister dst, const Operand& src) {
2676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x58);
2680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::subss(XMMRegister dst, const Operand& src) {
2685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5C);
2689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::mulss(XMMRegister dst, const Operand& src) {
2694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x59);
2698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::divss(XMMRegister dst, const Operand& src) {
2703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0xF3);
2705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0F);
2706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x5E);
2707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::sqrtss(XMMRegister dst, const Operand& src) {
2712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x51);
2716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::ucomiss(XMMRegister dst, const Operand& src) {
2721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x0f);
2723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(0x2e);
2724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src);
2725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::maxss(XMMRegister dst, const Operand& src) {
2729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5F);
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::minss(XMMRegister dst, const Operand& src) {
2738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x5D);
2742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src);
2743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// AVX instructions
2747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmasd(byte op, XMMRegister dst, XMMRegister src1,
2748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW1);
2752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vfmass(byte op, XMMRegister dst, XMMRegister src1,
2758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       const Operand& src2) {
2759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(FMA3));
2760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, k66, k0F38, kW0);
2762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::vsd(byte op, XMMRegister dst, XMMRegister src1,
2768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                    const Operand& src2) {
2769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsEnabled(AVX));
2770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EnsureSpace ensure_space(this);
2771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_vex_prefix(src1, kLIG, kF2, k0F, kWIG);
2772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EMIT(op);
2773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  emit_sse_operand(dst, src2);
2774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vss(byte op, XMMRegister dst, XMMRegister src1,
2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kLIG, kF3, k0F, kWIG);
2782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vps(byte op, XMMRegister dst, XMMRegister src1,
2788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, kNone, k0F, kWIG);
2792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1,
2798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    const Operand& src2) {
2799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(AVX));
2800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(src1, kL128, k66, k0F, kWIG);
2802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_sse_operand(dst, src2);
2804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi1(byte op, Register reg, Register vreg, const Operand& rm) {
2808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kNone, k0F38, kW0);
2811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::tzcnt(Register dst, const Operand& src) {
2817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI1));
2818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBC);
2822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::lzcnt(Register dst, const Operand& src) {
2827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(LZCNT));
2828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xBD);
2832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::popcnt(Register dst, const Operand& src) {
2837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(POPCNT));
2838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF3);
2840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0x0F);
2841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xB8);
2842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::bmi2(SIMDPrefix pp, byte op, Register reg, Register vreg,
2847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     const Operand& rm) {
2848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, pp, k0F38, kW0);
2851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(op);
2852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(reg, rm);
2853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::rorx(Register dst, const Operand& src, byte imm8) {
2857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsEnabled(BMI2));
2858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_uint8(imm8));
2859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register vreg = {0};  // VEX.vvvv unused
2860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
2861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(vreg, kLZ, kF2, k0F3A, kW0);
2862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(0xF0);
2863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_operand(dst, src);
2864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EMIT(imm8);
2865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { reg.code() };
2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  emit_operand(ireg, adr);
2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) {
2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28796ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Assembler::emit_sse_operand(Register dst, XMMRegister src) {
28806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  EMIT(0xC0 | dst.code() << 3 | src.code());
28816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
28826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Assembler::emit_sse_operand(XMMRegister dst, Register src) {
2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EMIT(0xC0 | (dst.code() << 3) | src.code());
2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Assembler::emit_vex_prefix(XMMRegister vreg, VectorLength l, SIMDPrefix pp,
2890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                LeadingOpcode mm, VexW w) {
2891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (mm != k0F || w != kW0) {
2892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc4);
2893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Change RXB from "110" to "111" to align with gdb disassembler.
2894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EMIT(0xe0 | mm);
2895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(w | ((~vreg.code() & 0xf) << 3) | l | pp);
2896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
2897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(0xc5);
2898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    EMIT(((~vreg.code()) << 3) | l | pp);
2899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_vex_prefix(Register vreg, VectorLength l, SIMDPrefix pp,
2904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                LeadingOpcode mm, VexW w) {
2905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  XMMRegister ivreg = {vreg.code()};
2906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_vex_prefix(ivreg, l, pp, mm, w);
2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::GrowBuffer() {
2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer_overflow());
2912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!own_buffer_) FATAL("external code buffer is too small");
2913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Compute new buffer size.
2915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CodeDesc desc;  // the new buffer
2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  desc.buffer_size = 2 * buffer_size_;
2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Some internal data structures overflow for very large buffers,
2919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // they must ensure that kMaximalBufferSize is not too large.
2920c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (desc.buffer_size > kMaximalBufferSize ||
2921c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      static_cast<size_t>(desc.buffer_size) >
2922c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          isolate()->heap()->MaxOldGenerationSize()) {
2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8::FatalProcessOutOfMemory("Assembler::GrowBuffer");
2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up new buffer.
2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.buffer = NewArray<byte>(desc.buffer_size);
2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  desc.origin = this;
2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.instr_size = pc_offset();
2930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc.reloc_size = (buffer_ + buffer_size_) - (reloc_info_writer.pos());
2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Clear the buffer in debug mode. Use 'int3' instructions to make
2933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sure to get into problems if we ever run uninitialized code.
2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  memset(desc.buffer, 0xCC, desc.buffer_size);
2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Copy the data.
2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int pc_delta = desc.buffer - buffer_;
2940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int rc_delta = (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_);
2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(desc.buffer, buffer_, desc.instr_size);
2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MemMove(rc_delta + reloc_info_writer.pos(), reloc_info_writer.pos(),
2943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          desc.reloc_size);
2944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Switch buffers.
2946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeleteArray(buffer_);
2947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_ = desc.buffer;
2948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  buffer_size_ = desc.buffer_size;
2949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += pc_delta;
2950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
2951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               reloc_info_writer.last_pc() + pc_delta);
2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Relocate internal references.
2954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (auto pos : internal_reference_positions_) {
2955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t* p = reinterpret_cast<int32_t*>(buffer_ + pos);
2956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *p += pc_delta;
2957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!buffer_overflow());
2960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
2964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(op1) && is_uint8(op2));  // wrong opcode
2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(imm8));
2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((op1 & 0x01) == 0);  // should be 8bit operation
2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op1);
2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(op2 | dst.code());
2969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(imm8);
2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_arith(int sel, Operand dst, const Immediate& x) {
2974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((0 <= sel) && (sel <= 7));
2975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Register ireg = { sel };
2976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (x.is_int8()) {
2977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x83);  // using a sign-extended 8-bit immediate.
2978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(x.x_ & 0xFF);
2980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (dst.is_reg(eax)) {
2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT((sel << 3) | 0x05);  // short form if the destination is eax.
2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EMIT(0x81);  // using a literal 32-bit immediate.
2985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit_operand(ireg, dst);
2986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    emit(x);
2987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_operand(Register reg, const Operand& adr) {
2992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const unsigned length = adr.len_;
2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length > 0);
2994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit updated ModRM byte containing the given register.
2996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_[0] = (adr.buf_[0] & ~0x38) | (reg.code() << 3);
2997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit the rest of the encoded operand.
2999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (unsigned i = 1; i < length; i++) pc_[i] = adr.buf_[i];
3000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pc_ += length;
3001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Emit relocation information if necessary.
3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length >= sizeof(int32_t) && !RelocInfo::IsNone(adr.rmode_)) {
3004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pc_ -= sizeof(int32_t);  // pc_ must be *at* disp32
3005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    RecordRelocInfo(adr.rmode_);
3006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (adr.rmode_ == RelocInfo::INTERNAL_REFERENCE) {  // Fixup for labels
3007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      emit_label(*reinterpret_cast<Label**>(pc_));
3008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
3009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      pc_ += sizeof(int32_t);
3010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
3011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::emit_label(Label* label) {
3016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (label->is_bound()) {
3017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    internal_reference_positions_.push_back(pc_offset());
3018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit(reinterpret_cast<uint32_t>(buffer_ + label->pos()));
3019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
3020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    emit_disp(label, Displacement::CODE_ABSOLUTE);
3021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::emit_farith(int b1, int b2, int i) {
3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_uint8(b1) && is_uint8(b2));  // wrong opcode
3027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= i &&  i < 8);  // illegal stack offset
3028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b1);
3029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EMIT(b2 + i);
3030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::db(uint8_t data) {
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EnsureSpace ensure_space(this);
3035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  EMIT(data);
3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Assembler::dd(uint32_t data) {
3040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EnsureSpace ensure_space(this);
3041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  emit(data);
3042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dq(uint64_t data) {
3046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_q(data);
3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Assembler::dd(Label* label) {
3052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EnsureSpace ensure_space(this);
3053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
3054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  emit_label(label);
3055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!RelocInfo::IsNone(rmode));
3060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Don't record external references unless the heap will be serialized.
3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !serializer_enabled() && !emit_debug_code()) {
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
3064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RelocInfo rinfo(isolate(), pc_, rmode, data, NULL);
3066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  reloc_info_writer.Write(&rinfo);
3067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
3071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
3072f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
3073f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif  // V8_TARGET_ARCH_IA32
3074