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