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