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