assembler_x86_64.cc revision 6005a87fa5524bd44c36f4dd6adca92e2d4bc9b1
1fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko/* 2fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Copyright (C) 2014 The Android Open Source Project 3fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * 4fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Licensed under the Apache License, Version 2.0 (the "License"); 5fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * you may not use this file except in compliance with the License. 6fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * You may obtain a copy of the License at 7fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * 8fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * http://www.apache.org/licenses/LICENSE-2.0 9fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * 10fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Unless required by applicable law or agreed to in writing, software 11fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * distributed under the License is distributed on an "AS IS" BASIS, 12fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * See the License for the specific language governing permissions and 14fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * limitations under the License. 15fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko */ 16fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 17fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "assembler_x86_64.h" 18fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 19fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "base/casts.h" 20fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "entrypoints/quick/quick_entrypoints.h" 21fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "memory_region.h" 22fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "thread.h" 23fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 24fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace art { 25fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace x86_64 { 26fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersstd::ostream& operator<<(std::ostream& os, const CpuRegister& reg) { 28dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers return os << reg.AsRegister(); 29dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 30dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 31fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkostd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 32dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers return os << reg.AsFloatRegister(); 33fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 34fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 35fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkostd::ostream& operator<<(std::ostream& os, const X87Register& reg) { 36fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return os << "ST" << static_cast<int>(reg); 37fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 38fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 39dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::call(CpuRegister reg) { 40fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 41dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 42fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 43dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(2, reg.LowBits()); 44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 45fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 46fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 47fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::call(const Address& address) { 48fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 49dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 50fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 51fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(2, address); 52fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 53fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 54fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 55fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::call(Label* label) { 56fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 57fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE8); 58fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kSize = 5; 591cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray // Offset by one because we already have emitted the opcode. 601cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray EmitLabel(label, kSize - 1); 61fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 62fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 63dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::pushq(CpuRegister reg) { 64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 65dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 66dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0x50 + reg.LowBits()); 67fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 68fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 69fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 70fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::pushq(const Address& address) { 71fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 72dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 73fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 74fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(6, address); 75fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 76fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 77fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 78fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::pushq(const Immediate& imm) { 79fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 805a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // pushq only supports 32b immediate. 81fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (imm.is_int8()) { 82fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x6A); 83fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 84fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 85fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x68); 86fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 87fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 88fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 89fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 90fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 91dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::popq(CpuRegister reg) { 92fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 94dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0x58 + reg.LowBits()); 95fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 96fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 97fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 98fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::popq(const Address& address) { 99fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 101fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8F); 102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, address); 103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 104fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 105fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 106dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, const Immediate& imm) { 107fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1085a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe if (imm.is_int32()) { 1095a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 32 bit. Note: sign-extends. 1105a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 1115a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xC7); 1125a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(0, dst.LowBits()); 1135a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt32(static_cast<int32_t>(imm.value())); 1145a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } else { 1155a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 1165a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xB8 + dst.LowBits()); 1175a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt64(imm.value()); 1185a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 119fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 120fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 121fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 122dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, const Immediate& imm) { 123946e143941d456a4ec666f7f54719c65c5aa3f5dRoland Levillain CHECK(imm.is_int32()); 124fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 125dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 126dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xB8 + dst.LowBits()); 127fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 128fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 129fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 13140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::movq(const Address& dst, const Immediate& imm) { 13240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell CHECK(imm.is_int32()); 13340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 13440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst); 13540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xC7); 13640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(0, dst); 13740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitImmediate(imm); 13840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 13940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 14040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 141dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, CpuRegister src) { 142fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1435a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 0x89 is movq r/m64 <- r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 1445a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(src, dst); 145fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 146dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(src.LowBits(), dst.LowBits()); 147fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 148fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 150dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, CpuRegister src) { 151fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 152dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 153ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitUint8(0x8B); 154ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitRegisterOperand(dst.LowBits(), src.LowBits()); 155fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 156fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 157fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 158dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, const Address& src) { 159fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 160dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(dst, src); 161fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8B); 162dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 163fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 164fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 165fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 166dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, const Address& src) { 167fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 168dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 169fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8B); 170dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 171fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 172fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 173fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 174dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(const Address& dst, CpuRegister src) { 175fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 176dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(src, dst); 177fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 178dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 179fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 180fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 181fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 182dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(const Address& dst, CpuRegister src) { 183fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 184dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 185fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 186dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 187fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 188fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 189fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movl(const Address& dst, const Immediate& imm) { 190fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 191dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 192fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC7); 193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, dst); 194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 196fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1977a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86_64Assembler::movntl(const Address& dst, CpuRegister src) { 1987a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1997a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOptionalRex32(src, dst); 2007a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0x0F); 2017a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0xC3); 2027a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOperand(src.LowBits(), dst); 2037a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell} 2047a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell 2057a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86_64Assembler::movntq(const Address& dst, CpuRegister src) { 2067a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2077a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitRex64(src, dst); 2087a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0x0F); 2097a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0xC3); 2107a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOperand(src.LowBits(), dst); 2117a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell} 21271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 21371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src) { 21471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe cmov(c, dst, src, true); 21571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 21671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 21771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src, bool is64bit) { 21871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 22071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 22171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x40 + c); 22271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitRegisterOperand(dst.LowBits(), src.LowBits()); 22371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 22471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 22571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 226abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendellvoid X86_64Assembler::cmov(Condition c, CpuRegister dst, const Address& src, bool is64bit) { 227abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 228abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell if (is64bit) { 229abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitRex64(dst, src); 230abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell } else { 231abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitOptionalRex32(dst, src); 232abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell } 233abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x0F); 234abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x40 + c); 235abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitOperand(dst.LowBits(), src); 236abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell} 237abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 238abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 239dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxb(CpuRegister dst, CpuRegister src) { 240fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 241dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(dst, src); 242fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 243fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB6); 244dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 245fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 246fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 247fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 248dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxb(CpuRegister dst, const Address& src) { 249fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 250d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // Byte register is only in the source register form, so we don't use 251d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // EmitOptionalByteRegNormalizingRex32(dst, src); 252d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex32(dst, src); 253fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 254fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB6); 255dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 256fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 257fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 258fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 259dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxb(CpuRegister dst, CpuRegister src) { 260fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 261dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(dst, src); 262fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 263fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBE); 264dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 265fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 266fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 267fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 268dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxb(CpuRegister dst, const Address& src) { 269fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 270d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // Byte register is only in the source register form, so we don't use 271d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // EmitOptionalByteRegNormalizingRex32(dst, src); 272d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex32(dst, src); 273fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 274fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBE); 275dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 276fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 277fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 278fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 279dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movb(CpuRegister /*dst*/, const Address& /*src*/) { 280fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko LOG(FATAL) << "Use movzxb or movsxb instead."; 281fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 282fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 283fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 284dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movb(const Address& dst, CpuRegister src) { 285fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 286dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(src, dst); 287fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x88); 288dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 289fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 290fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 291fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 292fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movb(const Address& dst, const Immediate& imm) { 293fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 29426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOptionalRex32(dst); 295fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC6); 296dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(Register::RAX, dst); 297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_int8()); 298fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 299fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 300fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 301fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 302dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxw(CpuRegister dst, CpuRegister src) { 303fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 304dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 305fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 306fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB7); 307dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 308fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 309fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 311dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxw(CpuRegister dst, const Address& src) { 312fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 313dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 314fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 315fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB7); 316dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 317fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 319fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 320dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxw(CpuRegister dst, CpuRegister src) { 321fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 322dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 323fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 324fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBF); 325dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 326fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 328fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 329dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxw(CpuRegister dst, const Address& src) { 330fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 332fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBF); 334dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 335fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 336fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 337fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 338dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movw(CpuRegister /*dst*/, const Address& /*src*/) { 339fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko LOG(FATAL) << "Use movzxw or movsxw instead."; 340fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 341fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 342fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 343dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movw(const Address& dst, CpuRegister src) { 344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperandSizeOverride(); 346e4ded41ae2648973d5fed8c6bafaebf917ea7d17Nicolas Geoffray EmitOptionalRex32(src, dst); 347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 348dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 349fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 350fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 35226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86_64Assembler::movw(const Address& dst, const Immediate& imm) { 35326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 35426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 35526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOptionalRex32(dst); 35626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 35726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(Register::RAX, dst); 358b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 35926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 36026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 36126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 36226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 36326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 364dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::leaq(CpuRegister dst, const Address& src) { 365fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 366dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(dst, src); 367fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8D); 368dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 369fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 370fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 371fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 372748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffrayvoid X86_64Assembler::leal(CpuRegister dst, const Address& src) { 373748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 374748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitOptionalRex32(dst, src); 375748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitUint8(0x8D); 376748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitOperand(dst.LowBits(), src); 377748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray} 378748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray 379748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray 3807fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86_64Assembler::movaps(XmmRegister dst, XmmRegister src) { 3817fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3827fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitOptionalRex32(dst, src); 3837fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 3847fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 385102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray EmitXmmRegisterOperand(dst.LowBits(), src); 3867fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 3877fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3887fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 389c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movaps(XmmRegister dst, const Address& src) { 390c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 391c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 392c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 393c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 394c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 395c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 396c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 397c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 398c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movups(XmmRegister dst, const Address& src) { 399c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 400c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 401c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 402c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 403c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 404c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 405c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 406c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 407c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movaps(const Address& dst, XmmRegister src) { 408c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 409c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 410c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 411c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 412c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 413c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 414c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 415c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 416c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movups(const Address& dst, XmmRegister src) { 417c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 418c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 419c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 420c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 421c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 422c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 423c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 424c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 425fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(XmmRegister dst, const Address& src) { 426fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 427fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 428dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 429fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 430fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x10); 431dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 432fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 433fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 434fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 435fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(const Address& dst, XmmRegister src) { 436fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 437fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 438dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 439fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 440fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 441dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 442fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 443fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 444fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 445fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(XmmRegister dst, XmmRegister src) { 446fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 447fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 448851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); // Movss is MR encoding instead of the usual RM. 449fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 450fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 451dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(src.LowBits(), dst); 452fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 453fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 454fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 455dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillainvoid X86_64Assembler::movsxd(CpuRegister dst, CpuRegister src) { 456dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 45757a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray EmitRex64(dst, src); 458dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitUint8(0x63); 459dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitRegisterOperand(dst.LowBits(), src.LowBits()); 460dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain} 461dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 462dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 463dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillainvoid X86_64Assembler::movsxd(CpuRegister dst, const Address& src) { 464dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 4657fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(dst, src); 466dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitUint8(0x63); 467dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitOperand(dst.LowBits(), src); 468dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain} 469dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 470dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 471dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movd(XmmRegister dst, CpuRegister src) { 47271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe movd(dst, src, true); 47371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 47471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 47571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(CpuRegister dst, XmmRegister src) { 47671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe movd(dst, src, true); 47771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 47871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 47971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(XmmRegister dst, CpuRegister src, bool is64bit) { 480fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 481fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 48271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 483fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 484fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x6E); 485dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 486fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 487fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 48871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(CpuRegister dst, XmmRegister src, bool is64bit) { 489fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 490fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 49171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, src.NeedsRex(), false, dst.NeedsRex()); 492fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 493fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x7E); 494dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), Operand(dst)); 495fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 496fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 497fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 498fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addss(XmmRegister dst, XmmRegister src) { 499fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 500fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 501dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 502fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 503fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 504dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 505fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 506fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 507fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 508fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addss(XmmRegister dst, const Address& src) { 509fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 510fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 511dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 512fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 513fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 514dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 515fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 516fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 517fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 518fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subss(XmmRegister dst, XmmRegister src) { 519fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 520fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 521dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 522fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 523fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 525fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 526fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 527fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 528fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subss(XmmRegister dst, const Address& src) { 529fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 530fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 532fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 533fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 534dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 535fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 536fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 537fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 538fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulss(XmmRegister dst, XmmRegister src) { 539fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 540fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 541dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 542fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 543fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 544dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 545fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 546fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 547fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 548fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulss(XmmRegister dst, const Address& src) { 549fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 550fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 551dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 552fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 553fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 554dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 555fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 556fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 557fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 558fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divss(XmmRegister dst, XmmRegister src) { 559fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 560fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 561dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 562fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 563fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 564dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 565fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 566fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 567fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 568fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divss(XmmRegister dst, const Address& src) { 569fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 570fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 571dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 572fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 573fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 575fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 576fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 577fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 578c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::addps(XmmRegister dst, XmmRegister src) { 579c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 580c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 581c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 582c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 583c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 584c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 585c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 586c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 587c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::subps(XmmRegister dst, XmmRegister src) { 588c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 589c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 590c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 591c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 592c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 593c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 594c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 595c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 596c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::mulps(XmmRegister dst, XmmRegister src) { 597c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 599c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 600c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 601c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 602c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 603c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 604c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 605c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::divps(XmmRegister dst, XmmRegister src) { 606c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 607c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 608c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 609c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 610c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 611c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 612c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 613c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 614fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::flds(const Address& src) { 615fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 616fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 617fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, src); 618fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 619fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 620fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 62124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fsts(const Address& dst) { 62224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 62324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 62424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 62524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 62624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 62724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 628fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fstps(const Address& dst) { 629fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 630fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 631fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 632fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 633fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 634fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 635c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(XmmRegister dst, XmmRegister src) { 636c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 637c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 638c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 639c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 640c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 641c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 642c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 643c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 644c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 645c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(XmmRegister dst, const Address& src) { 646c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 647c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 648c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 649c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 650c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 651c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 652c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 653c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 654c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 655c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movupd(XmmRegister dst, const Address& src) { 656c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 657c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 658c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 659c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 660c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 661c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 662c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 663c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 664c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 665c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(const Address& dst, XmmRegister src) { 666c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 667c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 668c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 669c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 670c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 671c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 672c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 673c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 674c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 675c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movupd(const Address& dst, XmmRegister src) { 676c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 677c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 678c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 679c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 680c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 681c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 682c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 683c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 684c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 685fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(XmmRegister dst, const Address& src) { 686fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 687fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 688dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 689fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 690fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x10); 691dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 692fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 693fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 694fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 695fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(const Address& dst, XmmRegister src) { 696fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 697fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 698dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 699fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 700fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 701dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 702fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 703fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 704fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 705fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(XmmRegister dst, XmmRegister src) { 706fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 707fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 708851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); // Movsd is MR encoding instead of the usual RM. 709fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 710fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 711dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(src.LowBits(), dst); 712fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 713fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 714fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 715fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addsd(XmmRegister dst, XmmRegister src) { 716fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 717fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 718dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 719fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 720fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 721dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 722fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 723fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 724fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 725fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addsd(XmmRegister dst, const Address& src) { 726fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 727fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 728dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 729fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 730fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 731dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 732fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 733fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 734fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 735fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subsd(XmmRegister dst, XmmRegister src) { 736fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 737fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 738dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 739fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 740fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 741dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 742fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 743fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 744fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 745fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subsd(XmmRegister dst, const Address& src) { 746fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 747fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 748dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 749fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 750fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 751dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 752fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 753fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 754fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 755fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulsd(XmmRegister dst, XmmRegister src) { 756fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 757fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 758dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 759fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 760fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 761dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 762fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 763fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 764fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 765fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulsd(XmmRegister dst, const Address& src) { 766fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 767fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 768dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 769fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 770fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 771dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 772fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 773fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 774fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 775fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divsd(XmmRegister dst, XmmRegister src) { 776fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 777fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 778dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 779fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 780fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 781dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 782fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 783fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 784fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 785fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divsd(XmmRegister dst, const Address& src) { 786fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 787fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 788dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 789fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 790fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 791dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 792fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 793fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 794fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 795c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::addpd(XmmRegister dst, XmmRegister src) { 796c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 797c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 798c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 799c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 800c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 801c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 802c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 803c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 804c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 805c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::subpd(XmmRegister dst, XmmRegister src) { 806c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 807c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 808c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 809c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 810c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 811c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 812c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 813c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 814c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 815c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::mulpd(XmmRegister dst, XmmRegister src) { 816c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 817c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 818c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 819c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 820c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 821c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 822c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 823c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 824c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 825c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::divpd(XmmRegister dst, XmmRegister src) { 826c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 827c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 828c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 829c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 830c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 831c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 832c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 833c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 834c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 83568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(XmmRegister dst, XmmRegister src) { 83668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 83768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 83868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 83968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 84068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 84168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 84268555e952eea58023fa403951b1491496acf0f4bAart Bik} 84368555e952eea58023fa403951b1491496acf0f4bAart Bik 84468555e952eea58023fa403951b1491496acf0f4bAart Bik 84568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(XmmRegister dst, const Address& src) { 84668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 84868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 84968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 85068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 85168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst.LowBits(), src); 85268555e952eea58023fa403951b1491496acf0f4bAart Bik} 85368555e952eea58023fa403951b1491496acf0f4bAart Bik 85468555e952eea58023fa403951b1491496acf0f4bAart Bik 85568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqu(XmmRegister dst, const Address& src) { 85668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 85868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 85968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 86068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 86168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst.LowBits(), src); 86268555e952eea58023fa403951b1491496acf0f4bAart Bik} 86368555e952eea58023fa403951b1491496acf0f4bAart Bik 86468555e952eea58023fa403951b1491496acf0f4bAart Bik 86568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(const Address& dst, XmmRegister src) { 86668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 86868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(src, dst); 86968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 87068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 87168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src.LowBits(), dst); 87268555e952eea58023fa403951b1491496acf0f4bAart Bik} 87368555e952eea58023fa403951b1491496acf0f4bAart Bik 87468555e952eea58023fa403951b1491496acf0f4bAart Bik 87568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqu(const Address& dst, XmmRegister src) { 87668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 87768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 87868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(src, dst); 87968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 88068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 88168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src.LowBits(), dst); 88268555e952eea58023fa403951b1491496acf0f4bAart Bik} 88368555e952eea58023fa403951b1491496acf0f4bAart Bik 88468555e952eea58023fa403951b1491496acf0f4bAart Bik 885e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddb(XmmRegister dst, XmmRegister src) { 886e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 887e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 888e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 889e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 890e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFC); 891e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 892e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 893e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 894e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 895e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubb(XmmRegister dst, XmmRegister src) { 896e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 897e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 898e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 899e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 900e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF8); 901e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 902e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 903e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 904e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 905e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddw(XmmRegister dst, XmmRegister src) { 906e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 907e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 908e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 909e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 910e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFD); 911e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 912e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 913e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 914e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 915e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubw(XmmRegister dst, XmmRegister src) { 916e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 917e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 918e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 919e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 920e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF9); 921e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 922e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 923e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 924e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 925e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::pmullw(XmmRegister dst, XmmRegister src) { 926e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 927e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 928e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 929e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 930e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD5); 931e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 932e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 933e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 934e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 93568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::paddd(XmmRegister dst, XmmRegister src) { 93668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 93868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 93968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 94068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFE); 94168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 94268555e952eea58023fa403951b1491496acf0f4bAart Bik} 94368555e952eea58023fa403951b1491496acf0f4bAart Bik 94468555e952eea58023fa403951b1491496acf0f4bAart Bik 94568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::psubd(XmmRegister dst, XmmRegister src) { 94668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 94768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 94868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 94968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 95068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFA); 95168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 95268555e952eea58023fa403951b1491496acf0f4bAart Bik} 95368555e952eea58023fa403951b1491496acf0f4bAart Bik 95468555e952eea58023fa403951b1491496acf0f4bAart Bik 95568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pmulld(XmmRegister dst, XmmRegister src) { 95668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 95768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 95868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 95968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 96068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x38); 96168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x40); 96268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 96368555e952eea58023fa403951b1491496acf0f4bAart Bik} 96468555e952eea58023fa403951b1491496acf0f4bAart Bik 96568555e952eea58023fa403951b1491496acf0f4bAart Bik 966e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddq(XmmRegister dst, XmmRegister src) { 967e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 968e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 969e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 970e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 971e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD4); 972e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 973e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 974e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 975e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 976e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubq(XmmRegister dst, XmmRegister src) { 977e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 978e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 979e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 980e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 981e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFB); 982e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 983e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 984e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 985e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 986dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src) { 9876d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain cvtsi2ss(dst, src, false); 9886d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain} 9896d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain 9906d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain 9916d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillainvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src, bool is64bit) { 992fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 993fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 9946d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain if (is64bit) { 9956d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 9966d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain EmitRex64(dst, src); 9976d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain } else { 9986d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain EmitOptionalRex32(dst, src); 9996d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain } 1000fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1001fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2A); 1002dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 1003fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1004fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1005fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 100640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, const Address& src, bool is64bit) { 100740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF3); 100940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (is64bit) { 101040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell // Emit a REX.W prefix if the operand size is 64 bits. 101140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 101240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } else { 101340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 101440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } 101540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 101640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2A); 101740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 101840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 101940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 102040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1021dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src) { 1022647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain cvtsi2sd(dst, src, false); 1023647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1024647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1025647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1026647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src, bool is64bit) { 1027fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1028fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1029647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain if (is64bit) { 1030647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 1031647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain EmitRex64(dst, src); 1032647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain } else { 1033647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain EmitOptionalRex32(dst, src); 1034647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain } 1035fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1036fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2A); 1037dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 1038fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1039fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1040fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 104140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, const Address& src, bool is64bit) { 104240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 104340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF2); 104440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (is64bit) { 104540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell // Emit a REX.W prefix if the operand size is 64 bits. 104640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 104740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } else { 104840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 104940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } 105040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 105140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2A); 105240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 105340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 105440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 105540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1056dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtss2si(CpuRegister dst, XmmRegister src) { 1057fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1058fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1059dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1060fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1061fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2D); 1062dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1063fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1064fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1065fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1066fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 1067fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1068fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1069dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1070fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1071fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5A); 1072dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1073fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1074fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1075fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 107640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtss2sd(XmmRegister dst, const Address& src) { 107740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 107840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF3); 107940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 108040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 108140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x5A); 108240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 108340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 108440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 108540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1086dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsd2si(CpuRegister dst, XmmRegister src) { 1087fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1088fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1089dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1090fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1091fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2D); 1092dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1093fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1094fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1095fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1096dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src) { 1097624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain cvttss2si(dst, src, false); 1098624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain} 1099624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 1100624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 1101624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillainvoid X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1104624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain if (is64bit) { 1105624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 1106624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitRex64(dst, src); 1107624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain } else { 1108624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitOptionalRex32(dst, src); 1109624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain } 1110fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1111fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2C); 1112dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1113fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1114fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1116dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src) { 11174c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain cvttsd2si(dst, src, false); 11184c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain} 11194c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain 11204c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain 11214c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillainvoid X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1122fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1123fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 11244c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain if (is64bit) { 11254c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 11264c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain EmitRex64(dst, src); 11274c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain } else { 11284c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain EmitOptionalRex32(dst, src); 11294c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain } 1130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1131fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2C); 1132dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1133fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1134fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1135fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1136fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 1137fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1138fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1139dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1140fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1141fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5A); 1142dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1143fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1144fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1145fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 114640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsd2ss(XmmRegister dst, const Address& src) { 114740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 114840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF2); 114940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 115040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 115140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x5A); 115240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 115340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 115440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 115540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 11563ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bikvoid X86_64Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) { 11573ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11583ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitOptionalRex32(dst, src); 11593ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x0F); 11603ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x5B); 11613ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 11623ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik} 11633ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 11643ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 1165fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 1166fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1167fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1168dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1169fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1170fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE6); 1171dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1172fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1173fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1174fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1175fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::comiss(XmmRegister a, XmmRegister b) { 1176fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1177dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(a, b); 1178fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1179fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2F); 1180dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(a.LowBits(), b); 1181fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1182fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1183fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 118440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::comiss(XmmRegister a, const Address& b) { 118540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 118640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 118740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 118840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2F); 118940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 119040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 119140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 119240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::comisd(XmmRegister a, XmmRegister b) { 1194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1196dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(a, b); 1197fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1198fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2F); 1199dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(a.LowBits(), b); 1200fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1201fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 120240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 120340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::comisd(XmmRegister a, const Address& b) { 120440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 120540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x66); 120640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 120740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 120840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2F); 120940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 121040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 121140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 121240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1213ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86_64Assembler::ucomiss(XmmRegister a, XmmRegister b) { 1214ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1215ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitOptionalRex32(a, b); 1216ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1217ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1218ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a.LowBits(), b); 1219ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1220ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1221ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 122240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::ucomiss(XmmRegister a, const Address& b) { 122340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 122440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 122540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 122640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2E); 122740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 122840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 122940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 123040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1231ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86_64Assembler::ucomisd(XmmRegister a, XmmRegister b) { 1232ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1233ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 1234ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitOptionalRex32(a, b); 1235ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1236ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1237ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a.LowBits(), b); 1238ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1239ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1240fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 124140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::ucomisd(XmmRegister a, const Address& b) { 124240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 124340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x66); 124440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 124540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 124640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2E); 124740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 124840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 124940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 125040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1251fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86_64Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1252fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1253fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1254fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitOptionalRex32(dst, src); 1255fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1256fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1257fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 1258fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst.LowBits(), src); 1259fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1260fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1261fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1262fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1263fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86_64Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1264fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1265fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1266fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitOptionalRex32(dst, src); 1267fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1268fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1269fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 1270fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst.LowBits(), src); 1271fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1272fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1273fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1274fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1275fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 1276fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1277fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1278dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1279fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1280fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x51); 1281dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1282fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1283fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1284fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1285fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 1286fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1287fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1288dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1289fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1290fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x51); 1291dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1292fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1293fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1294fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1295fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorpd(XmmRegister dst, const Address& src) { 1296fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1298dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1299fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1300fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1301dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1302fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1303fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1304fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1305fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorpd(XmmRegister dst, XmmRegister src) { 1306fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1307fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1308dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1309fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1311dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1312fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1313fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1314fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1315fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorps(XmmRegister dst, const Address& src) { 1316fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1317dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1319fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1320dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1321fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1322fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1323fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1324fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorps(XmmRegister dst, XmmRegister src) { 1325fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1326dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1328fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1329dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1330fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1331fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1332fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 133368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pxor(XmmRegister dst, XmmRegister src) { 133468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 133568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 133668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 133768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 133868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEF); 133968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 134068555e952eea58023fa403951b1491496acf0f4bAart Bik} 134168555e952eea58023fa403951b1491496acf0f4bAart Bik 134268555e952eea58023fa403951b1491496acf0f4bAart Bik 1343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::andpd(XmmRegister dst, const Address& src) { 1344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1346dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1348fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x54); 1349dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1350fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 135271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::andpd(XmmRegister dst, XmmRegister src) { 135371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 135471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x66); 135571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 135671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 135771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x54); 135871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 135971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 136071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 136171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::andps(XmmRegister dst, XmmRegister src) { 136271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 136371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 136471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 136571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x54); 136671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 136771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 136871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 136968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pand(XmmRegister dst, XmmRegister src) { 137068555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 137168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 137268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 137368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 137468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xDB); 137568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 137668555e952eea58023fa403951b1491496acf0f4bAart Bik} 137768555e952eea58023fa403951b1491496acf0f4bAart Bik 137821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::andnpd(XmmRegister dst, XmmRegister src) { 137921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 138021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x66); 138121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 138221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 138321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x55); 138421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 138521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 138621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 138721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::andnps(XmmRegister dst, XmmRegister src) { 138821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 138921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 139021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 139121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x55); 139221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 139321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 139421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 139521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::pandn(XmmRegister dst, XmmRegister src) { 139621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 139721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x66); 139821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 139921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 140021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0xDF); 140121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 140221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 140321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 140471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::orpd(XmmRegister dst, XmmRegister src) { 140571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 140671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x66); 140771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 140871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 140971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x56); 141071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 141171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 141271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 141371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::orps(XmmRegister dst, XmmRegister src) { 141471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 141571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 141671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 141771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x56); 141871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 141971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 1420fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 142168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::por(XmmRegister dst, XmmRegister src) { 142268555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 142368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 142468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 142568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 142668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEB); 142768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 142868555e952eea58023fa403951b1491496acf0f4bAart Bik} 142912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 143067d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86_64Assembler::pavgb(XmmRegister dst, XmmRegister src) { 143167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 143267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x66); 143367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitOptionalRex32(dst, src); 143467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x0F); 143567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0xE0); 143667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 143767d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik} 143867d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik 143967d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86_64Assembler::pavgw(XmmRegister dst, XmmRegister src) { 144067d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 144167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x66); 144267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitOptionalRex32(dst, src); 144367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x0F); 144467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0xE3); 144567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 144667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik} 144767d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik 14486005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::psadbw(XmmRegister dst, XmmRegister src) { 14496005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14506005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14516005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14526005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14536005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF6); 14546005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14556005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14566005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14576005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::pmaddwd(XmmRegister dst, XmmRegister src) { 14586005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14596005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14606005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14616005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14626005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF5); 14636005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14646005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14656005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14666005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phaddw(XmmRegister dst, XmmRegister src) { 14676005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14686005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14696005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14706005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14716005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 14726005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x01); 14736005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14746005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14756005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14766005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phaddd(XmmRegister dst, XmmRegister src) { 14776005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14786005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14796005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14806005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14816005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 14826005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x02); 14836005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14846005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14856005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14866005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::haddps(XmmRegister dst, XmmRegister src) { 14876005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14886005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF2); 14896005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14906005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14916005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7C); 14926005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14936005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14946005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14956005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::haddpd(XmmRegister dst, XmmRegister src) { 14966005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14976005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14986005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14996005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15006005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7C); 15016005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15026005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15036005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15046005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phsubw(XmmRegister dst, XmmRegister src) { 15056005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15066005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15076005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15086005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15096005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 15106005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x05); 15116005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15126005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15136005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15146005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phsubd(XmmRegister dst, XmmRegister src) { 15156005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15166005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15176005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15186005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15196005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 15206005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x06); 15216005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15226005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15236005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15246005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::hsubps(XmmRegister dst, XmmRegister src) { 15256005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15266005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF2); 15276005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15286005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15296005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7D); 15306005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15316005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15326005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15336005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::hsubpd(XmmRegister dst, XmmRegister src) { 15346005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15356005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15366005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15376005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15386005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7D); 15396005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15406005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15416005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 1542c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsb(XmmRegister dst, XmmRegister src) { 1543c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1544c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1545c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1546c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1547c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1548c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1549c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1550c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1551c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1552c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsb(XmmRegister dst, XmmRegister src) { 1553c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1554c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1555c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1556c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1557c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1558c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3C); 1559c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1560c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1561c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1562c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsw(XmmRegister dst, XmmRegister src) { 1563c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1564c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1565c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1566c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1567c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xEA); 1568c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1569c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1570c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1571c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsw(XmmRegister dst, XmmRegister src) { 1572c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1573c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1574c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1575c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1576c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xEE); 1577c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1578c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1579c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1580c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsd(XmmRegister dst, XmmRegister src) { 1581c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1582c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1583c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1584c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1585c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1586c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x39); 1587c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1588c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1589c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1590c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsd(XmmRegister dst, XmmRegister src) { 1591c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1592c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1593c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1594c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1595c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1596c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3D); 1597c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1598c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1599c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1600c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminub(XmmRegister dst, XmmRegister src) { 1601c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1602c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1603c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1604c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1605c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xDA); 1606c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1607c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1608c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1609c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxub(XmmRegister dst, XmmRegister src) { 1610c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1611c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1612c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1613c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1614c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xDE); 1615c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1616c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1617c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1618c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminuw(XmmRegister dst, XmmRegister src) { 1619c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1620c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1621c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1622c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1623c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1624c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3A); 1625c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1626c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1627c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1628c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxuw(XmmRegister dst, XmmRegister src) { 1629c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1630c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1631c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1632c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1633c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1634c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3E); 1635c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1636c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1637c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1638c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminud(XmmRegister dst, XmmRegister src) { 1639c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1640c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1641c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1642c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1643c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1644c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3B); 1645c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1646c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1647c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1648c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxud(XmmRegister dst, XmmRegister src) { 1649c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1650c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1651c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1652c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1653c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1654c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3F); 1655c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1656c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1657c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1658c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::minps(XmmRegister dst, XmmRegister src) { 1659c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1660c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1661c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1662c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5D); 1663c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1664c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1665c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1666c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::maxps(XmmRegister dst, XmmRegister src) { 1667c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1668c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1669c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1670c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5F); 1671c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1672c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1673c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1674c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::minpd(XmmRegister dst, XmmRegister src) { 1675c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1676c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1677c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1678c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1679c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5D); 1680c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1681c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1682c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1683c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::maxpd(XmmRegister dst, XmmRegister src) { 1684c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1685c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1686c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1687c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1688c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5F); 1689c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1690c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1691c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 16924b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) { 16934b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16944b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 16954b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 16964b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 16974b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x74); 16984b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 16994b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17004b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17014b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) { 17024b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17034b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17044b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17054b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17064b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x75); 17074b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17084b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17094b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17104b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) { 17114b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17124b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17134b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17144b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17154b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x76); 17164b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17174b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17184b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17194b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) { 17204b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17214b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17224b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17234b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17244b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x38); 17254b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x29); 17264b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17274b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17284b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17298939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) { 17308939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17318939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17328939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17338939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17348939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x64); 17358939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17368939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17378939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17388939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) { 17398939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17408939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17418939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17428939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17438939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x65); 17448939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17458939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17468939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17478939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) { 17488939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17498939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17508939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17518939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17528939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17538939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17548939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17558939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17568939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) { 17578939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17588939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17598939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17608939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17618939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x38); 17628939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x37); 17638939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17648939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17658939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 176612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86_64Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 176712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 176812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x66); 176912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitOptionalRex32(dst, src); 177012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 177112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 177212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 177312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 177412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 177512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 177612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 177712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86_64Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) { 177812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 177912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitOptionalRex32(dst, src); 178012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 178112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 178212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 178312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 178412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 178512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 178612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 178768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 178868555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 178968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 179068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 179168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 179268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x70); 179368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 179468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(imm.value()); 179568555e952eea58023fa403951b1491496acf0f4bAart Bik} 179668555e952eea58023fa403951b1491496acf0f4bAart Bik 179768555e952eea58023fa403951b1491496acf0f4bAart Bik 1798e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklbw(XmmRegister dst, XmmRegister src) { 1799e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1800e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1801e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1802e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1803e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x60); 1804e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1805e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1806e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1807e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1808e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklwd(XmmRegister dst, XmmRegister src) { 1809e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1810e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1811e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1812e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1813e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x61); 1814e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1815e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1816e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1817e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1818e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 1819e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1820e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1821e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1822e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1823e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x62); 1824e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1825e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1826e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1827e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1828e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) { 1829e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1830e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1831e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1832e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1833e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x6C); 1834e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1835e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1836e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1837e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1838e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psllw(XmmRegister reg, const Immediate& shift_count) { 1839e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1840e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1841e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1842e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1843e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1844e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1845e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1846e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1847e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1848e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1849e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1850e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::pslld(XmmRegister reg, const Immediate& shift_count) { 1851e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1852e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1853e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1854e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1855e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1856e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1857e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1858e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1859e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1860e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1861e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1862e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psllq(XmmRegister reg, const Immediate& shift_count) { 1863e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1864e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1865e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1866e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1867e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1868e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1869e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1870e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1871e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1872e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1873e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1874e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psraw(XmmRegister reg, const Immediate& shift_count) { 1875e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1876e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1877e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1878e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1879e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1880e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1881e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1882e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1883e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1884e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1885e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1886e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrad(XmmRegister reg, const Immediate& shift_count) { 1887e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1888e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1889e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1890e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1891e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1892e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1893e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1894e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1895e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1896e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1897e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1898e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) { 1899e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1900e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1901e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1902e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1903e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1904e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1905e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1906e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1907e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1908e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1909e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1910e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrld(XmmRegister reg, const Immediate& shift_count) { 1911e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1912e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1913e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1914e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1915e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1916e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1917e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1918e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1919e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1920e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1921e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1922e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 1923e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1924e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1925e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1926e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1927e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1928e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1929e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1930e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1931e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1932e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1933e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1934fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fldl(const Address& src) { 1935fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1936fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 1937fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, src); 1938fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1939fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1940fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 194124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fstl(const Address& dst) { 194224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 194324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 194424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 194524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 194624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 194724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 1948fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fstpl(const Address& dst) { 1949fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1950fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 1951fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 1952fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1953fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1954fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 195524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fstsw() { 195624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 195724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 195824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 195924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 196024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 196124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 196224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 1963fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fnstcw(const Address& dst) { 1964fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1965fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 1966fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(7, dst); 1967fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1968fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1969fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1970fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fldcw(const Address& src) { 1971fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1972fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 1973fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, src); 1974fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1975fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1976fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1977fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fistpl(const Address& dst) { 1978fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1979fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDF); 1980fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(7, dst); 1981fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1982fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1983fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1984fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fistps(const Address& dst) { 1985fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1986fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDB); 1987fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 1988fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1989fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1990fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1991fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fildl(const Address& src) { 1992fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1993fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDF); 1994fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, src); 1995fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1996fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1997fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 19980a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86_64Assembler::filds(const Address& src) { 19990a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 20000a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 20010a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 20020a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 20030a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 20040a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 2005fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fincstp() { 2006fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2007fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2008fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2009fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2010fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2011fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2012fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ffree(const Immediate& index) { 2013fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(index.value(), 7); 2014fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2015fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 2016fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC0 + index.value()); 2017fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2018fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2019fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2020fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fsin() { 2021fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2022fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2023fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFE); 2024fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2025fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2026fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2027fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fcos() { 2028fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2029fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2030fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 2031fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2032fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2033fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2034fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fptan() { 2035fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2036fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2037fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 2038fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2039fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 204024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fucompp() { 204124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 204224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 204324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 204424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 204524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 204624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 204724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fprem() { 204824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 204924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 205024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 205124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 205224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 2053fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2054dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xchgl(CpuRegister dst, CpuRegister src) { 2055fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2056851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // There is a short version for rax. 2057851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2058851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // work. 2059851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool src_rax = src.AsRegister() == RAX; 2060851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool dst_rax = dst.AsRegister() == RAX; 2061851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax || dst_rax) { 2062851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src_rax ? dst : src); 2063851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2064851df20225593b10e698a760ac3cd5243620700bAndreas Gampe return; 2065851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2066851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2067851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // General case. 2068851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); 2069fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x87); 2070851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2071fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2072fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2073ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2074ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffrayvoid X86_64Assembler::xchgq(CpuRegister dst, CpuRegister src) { 2075ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2076851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // There is a short version for rax. 2077851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2078851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // work. 2079851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool src_rax = src.AsRegister() == RAX; 2080851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool dst_rax = dst.AsRegister() == RAX; 2081851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax || dst_rax) { 2082851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // If src == target, emit a nop instead. 2083851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax && dst_rax) { 2084851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90); 2085851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2086851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRex64(src_rax ? dst : src); 2087851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2088851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2089851df20225593b10e698a760ac3cd5243620700bAndreas Gampe return; 2090851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2091851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2092851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // General case. 2093851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRex64(src, dst); 2094ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitUint8(0x87); 2095851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2096ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray} 2097ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2098ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2099dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xchgl(CpuRegister reg, const Address& address) { 2100fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2101dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x87); 2103dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2104fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2105fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2106fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 21073b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkovvoid X86_64Assembler::cmpb(const Address& address, const Immediate& imm) { 21083b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21093b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov CHECK(imm.is_int32()); 21103b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOptionalRex32(address); 21113b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(0x80); 21123b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOperand(7, address); 21133b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(imm.value() & 0xFF); 21143b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov} 21153b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 21163b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 21173c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86_64Assembler::cmpw(const Address& address, const Immediate& imm) { 21183c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21196ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 212046fe0650be6a69f63b54c0967194350c6a145557Nicolas Geoffray EmitOperandSizeOverride(); 21213c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitOptionalRex32(address); 21223c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 21233c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 21243c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 21253c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 2126dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg, const Immediate& imm) { 2127fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21286ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 2129dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(7, Operand(reg), imm); 2131fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2132fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2133fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2134dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg0, CpuRegister reg1) { 2135fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2136dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg0, reg1); 2137fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x3B); 2138dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg0.LowBits(), Operand(reg1)); 2139fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2140fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2141fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2142dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg, const Address& address) { 2143fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2144dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2145fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x3B); 2146dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2147fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2148fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2150d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpl(const Address& address, CpuRegister reg) { 2151d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2152d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex32(reg, address); 2153d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x39); 2154d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOperand(reg.LowBits(), address); 2155d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2156d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2157d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2158d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpl(const Address& address, const Immediate& imm) { 2159d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21606ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 2161d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex32(address); 2162d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitComplex(7, address, imm); 2163d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2164d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2165d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 21665a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::cmpq(CpuRegister reg0, CpuRegister reg1) { 21675a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21685a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(reg0, reg1); 21695a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x3B); 21705a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitOperand(reg0.LowBits(), Operand(reg1)); 21715a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 21725a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 21735a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 217496f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::cmpq(CpuRegister reg, const Immediate& imm) { 217596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 217696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 217796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitRex64(reg); 217896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitComplex(7, Operand(reg), imm); 217996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 218096f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 218196f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 218296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::cmpq(CpuRegister reg, const Address& address) { 218396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 218440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(reg, address); 218596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x3B); 218696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(reg.LowBits(), address); 218796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 218896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 218996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 2190d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpq(const Address& address, const Immediate& imm) { 2191d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 2192d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2193d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(address); 2194d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitComplex(7, address, imm); 2195d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2196d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2197d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2198dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister dst, CpuRegister src) { 2199fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2200dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2201fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x03); 2202dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 2203fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2204fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2205fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2206dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister reg, const Address& address) { 2207fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2208dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2209fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x03); 2210dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2211fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2212fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2213fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2214dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::testl(CpuRegister reg1, CpuRegister reg2) { 2215fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2216dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg1, reg2); 2217fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x85); 2218dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2219fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2220fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2221fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2222cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravlevoid X86_64Assembler::testl(CpuRegister reg, const Address& address) { 2223cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2224cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitOptionalRex32(reg, address); 2225cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitUint8(0x85); 2226cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitOperand(reg.LowBits(), address); 2227cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle} 2228cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle 2229cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle 2230dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::testl(CpuRegister reg, const Immediate& immediate) { 2231fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2232fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // For registers that have a byte variant (RAX, RBX, RCX, and RDX) 2233dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // we only test the byte CpuRegister to keep the encoding short. 2234dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (immediate.is_uint8() && reg.AsRegister() < 4) { 2235fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use zero-extended 8-bit immediate. 2236dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (reg.AsRegister() == RAX) { 2237fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xA8); 2238fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2239fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF6); 2240dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xC0 + reg.AsRegister()); 2241fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2242fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(immediate.value() & 0xFF); 2243dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else if (reg.AsRegister() == RAX) { 2244fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use short form if the destination is RAX. 2245fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xA9); 2246fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 2247fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2248dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2249fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2250fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, Operand(reg)); 2251fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 2252fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2253fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2254fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2255fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2256d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::testq(CpuRegister reg1, CpuRegister reg2) { 2257d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2258d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(reg1, reg2); 2259d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x85); 2260d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2261d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2262d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2263d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2264f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86_64Assembler::testq(CpuRegister reg, const Address& address) { 2265f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 22667fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(reg, address); 2267f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 2268f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg.LowBits(), address); 2269f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 2270f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 2271f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 2272953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86_64Assembler::testb(const Address& dst, const Immediate& imm) { 2273953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2274953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOptionalRex32(dst); 2275953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF6); 2276953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(Register::RAX, dst); 2277953437bd51059801d92079295f728d0260efca31Vladimir Marko CHECK(imm.is_int8()); 2278953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(imm.value() & 0xFF); 2279953437bd51059801d92079295f728d0260efca31Vladimir Marko} 2280953437bd51059801d92079295f728d0260efca31Vladimir Marko 2281953437bd51059801d92079295f728d0260efca31Vladimir Marko 2282953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86_64Assembler::testl(const Address& dst, const Immediate& imm) { 2283953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2284953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOptionalRex32(dst); 2285953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF7); 2286953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(0, dst); 2287953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitImmediate(imm); 2288953437bd51059801d92079295f728d0260efca31Vladimir Marko} 2289953437bd51059801d92079295f728d0260efca31Vladimir Marko 2290953437bd51059801d92079295f728d0260efca31Vladimir Marko 2291dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::andl(CpuRegister dst, CpuRegister src) { 2292fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2293dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2294fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x23); 2295dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2296fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2298fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 22999574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::andl(CpuRegister reg, const Address& address) { 23009574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23019574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 23029574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 23039574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 23049574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23059574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 23069574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2307dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::andl(CpuRegister dst, const Immediate& imm) { 2308fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2309dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 2310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(4, Operand(dst), imm); 2311fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2312fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2313fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2314412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffrayvoid X86_64Assembler::andq(CpuRegister reg, const Immediate& imm) { 2315412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2316412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray CHECK(imm.is_int32()); // andq only supports 32b immediate. 2317412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitRex64(reg); 2318412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitComplex(4, Operand(reg), imm); 2319412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray} 2320412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 2321412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 23229574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::andq(CpuRegister dst, CpuRegister src) { 23239574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23249574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitRex64(dst, src); 23259574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 23269574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 23279574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23289574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 23299574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 233040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::andq(CpuRegister dst, const Address& src) { 233140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 233240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 233340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x23); 233440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 233540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 233640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 233740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2338dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::orl(CpuRegister dst, CpuRegister src) { 2339fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2340dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2341fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0B); 2342dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 23469574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::orl(CpuRegister reg, const Address& address) { 23479574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23489574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 23499574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 23509574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 23519574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23529574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 23539574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2354dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::orl(CpuRegister dst, const Immediate& imm) { 2355fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2356dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 2357fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(1, Operand(dst), imm); 2358fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2359fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2360fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 23613f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendellvoid X86_64Assembler::orq(CpuRegister dst, const Immediate& imm) { 23623f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23633f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell CHECK(imm.is_int32()); // orq only supports 32b immediate. 23643f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitRex64(dst); 23653f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitComplex(1, Operand(dst), imm); 23663f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell} 23673f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 23683f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 23699574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::orq(CpuRegister dst, CpuRegister src) { 23709574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23719574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitRex64(dst, src); 23729574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 23739574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 23749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 23769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 237740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::orq(CpuRegister dst, const Address& src) { 237840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 237940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 238040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0B); 238140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 238240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 238340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 238440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2385dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xorl(CpuRegister dst, CpuRegister src) { 2386fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2387dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2388fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x33); 2389dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2390fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2391fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 23925a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 23939574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::xorl(CpuRegister reg, const Address& address) { 23949574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23959574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 23969574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 23979574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 23989574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23999574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24009574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24019574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::xorl(CpuRegister dst, const Immediate& imm) { 24029574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24039574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(dst); 24049574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 24059574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24069574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24079574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2408412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffrayvoid X86_64Assembler::xorq(CpuRegister dst, CpuRegister src) { 2409412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2410412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitRex64(dst, src); 2411412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitUint8(0x33); 2412412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 2413412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray} 2414412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 2415412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 24165a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::xorq(CpuRegister dst, const Immediate& imm) { 24175a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24185a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // xorq only supports 32b immediate. 24195a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 24205a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitComplex(6, Operand(dst), imm); 24215a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 24225a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 242340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::xorq(CpuRegister dst, const Address& src) { 242440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 242540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 242640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x33); 242740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 242840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 242940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 243040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2431dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers#if 0 2432dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::rex(bool force, bool w, Register* r, Register* x, Register* b) { 2433fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // REX.WRXB 2434fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // W - 64-bit operand 2435fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // R - MODRM.reg 2436fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // X - SIB.index 2437fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // B - MODRM.rm/SIB.base 2438dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = force ? 0x40 : 0; 2439dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 2440fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x48; // REX.W000 2441fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2442dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (r != nullptr && *r >= Register::R8 && *r < Register::kNumberOfCpuRegisters) { 2443fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x44; // REX.0R00 2444dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *r = static_cast<Register>(*r - 8); 2445fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2446dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (x != nullptr && *x >= Register::R8 && *x < Register::kNumberOfCpuRegisters) { 2447dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x42; // REX.00X0 2448dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *x = static_cast<Register>(*x - 8); 2449dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2450dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (b != nullptr && *b >= Register::R8 && *b < Register::kNumberOfCpuRegisters) { 2451fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x41; // REX.000B 2452dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *b = static_cast<Register>(*b - 8); 2453fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2454fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (rex != 0) { 2455fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(rex); 2456fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2457fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2458fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2459dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::rex_reg_mem(bool force, bool w, Register* dst, const Address& mem) { 2460dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // REX.WRXB 2461dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // W - 64-bit operand 2462dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // R - MODRM.reg 2463dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // X - SIB.index 2464dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // B - MODRM.rm/SIB.base 2465dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = mem->rex(); 2466dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (force) { 2467dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x40; // REX.0000 2468dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2469dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 2470dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x48; // REX.W000 2471dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2472dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (dst != nullptr && *dst >= Register::R8 && *dst < Register::kNumberOfCpuRegisters) { 2473dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x44; // REX.0R00 2474dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *dst = static_cast<Register>(*dst - 8); 2475dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2476dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (rex != 0) { 2477dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(rex); 2478dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2479dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 2480dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 2481dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid rex_mem_reg(bool force, bool w, Address* mem, Register* src); 2482dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers#endif 2483dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 2484dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister reg, const Immediate& imm) { 2485fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2486dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2487fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, Operand(reg), imm); 2488fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2489fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2490fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2491dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addq(CpuRegister reg, const Immediate& imm) { 2492fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24935a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // addq only supports 32b immediate. 2494dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(reg); 2495fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, Operand(reg), imm); 2496fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2497fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2498fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 249996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::addq(CpuRegister dst, const Address& address) { 250096f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25017fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(dst, address); 250296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x03); 250396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(dst.LowBits(), address); 250496f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 250596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 250696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 25075a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::addq(CpuRegister dst, CpuRegister src) { 25085a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25095a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 0x01 is addq r/m64 <- r/m64 + r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 25105a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(src, dst); 25115a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x01); 25125a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 25135a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 25145a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 25155a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 2516dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(const Address& address, CpuRegister reg) { 2517fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2519fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x01); 2520dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2521fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2522fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2523fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2524fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addl(const Address& address, const Immediate& imm) { 2525fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2526dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2527fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, address, imm); 2528fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2529fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2530fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister dst, CpuRegister src) { 2532fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2533dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2534fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2B); 2535dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2536fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2537fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2538fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister reg, const Immediate& imm) { 2540fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2541dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2542fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(5, Operand(reg), imm); 2543fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2544fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2545fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 25465a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::subq(CpuRegister reg, const Immediate& imm) { 25475a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25485a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // subq only supports 32b immediate. 25495a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(reg); 25505a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitComplex(5, Operand(reg), imm); 25515a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 25525a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 25535a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 25545a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::subq(CpuRegister dst, CpuRegister src) { 25555a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25565a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst, src); 25575a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x2B); 25585a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(dst.LowBits(), src.LowBits()); 25595a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 25605a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 25615a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 256296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::subq(CpuRegister reg, const Address& address) { 256396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25647fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(reg, address); 256596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x2B); 256696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(reg.LowBits() & 7, address); 256796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 256896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 256996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 2570dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister reg, const Address& address) { 2571fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2572dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2573fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2B); 2574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2575fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2576fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2577fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2578fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cdq() { 2579fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2580fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x99); 2581fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2582fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2583fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2584d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cqo() { 2585d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2586d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(); 2587d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x99); 2588d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2589d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2590d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2591dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::idivl(CpuRegister reg) { 2592fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2593dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2594fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2595dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xF8 | reg.LowBits()); 2596fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2597fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2598fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2599d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::idivq(CpuRegister reg) { 2600d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2601d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(reg); 2602d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0xF7); 2603d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0xF8 | reg.LowBits()); 2604d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2605d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2606d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2607dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister dst, CpuRegister src) { 2608fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2609dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2610fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2611fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAF); 2612dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2613fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2614fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 26154a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86_64Assembler::imull(CpuRegister dst, CpuRegister src, const Immediate& imm) { 2616fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2617851df20225593b10e698a760ac3cd5243620700bAndreas Gampe CHECK(imm.is_int32()); // imull only supports 32b immediate. 2618851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 26194a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOptionalRex32(dst, src); 2620851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2621851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // See whether imm can be represented as a sign-extended 8bit value. 2622851df20225593b10e698a760ac3cd5243620700bAndreas Gampe int32_t v32 = static_cast<int32_t>(imm.value()); 2623ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(v32)) { 2624851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Sign-extension works. 2625851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x6B); 26264a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst.LowBits(), Operand(src)); 2627851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 2628851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2629851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Not representable, use full immediate. 2630851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x69); 26314a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst.LowBits(), Operand(src)); 2632851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitImmediate(imm); 2633851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2634fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2635fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2636fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 26374a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86_64Assembler::imull(CpuRegister reg, const Immediate& imm) { 26384a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 26394a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 26404a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 26414a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 2642dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister reg, const Address& address) { 2643fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2644dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2645fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2646fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAF); 2647dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2648fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2649fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2650fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 265134bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister dst, CpuRegister src) { 265234bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 265334bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRex64(dst, src); 265434bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0x0F); 265534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0xAF); 265634bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRegisterOperand(dst.LowBits(), src.LowBits()); 265734bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 265834bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 265934bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 266034bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister reg, const Immediate& imm) { 26613f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell imulq(reg, reg, imm); 26623f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell} 26633f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 26643f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendellvoid X86_64Assembler::imulq(CpuRegister dst, CpuRegister reg, const Immediate& imm) { 266534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 266634bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle CHECK(imm.is_int32()); // imulq only supports 32b immediate. 2667851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 26683f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitRex64(dst, reg); 2669851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2670851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // See whether imm can be represented as a sign-extended 8bit value. 2671851df20225593b10e698a760ac3cd5243620700bAndreas Gampe int64_t v64 = imm.value(); 2672ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(v64)) { 2673851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Sign-extension works. 2674851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x6B); 26753f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitOperand(dst.LowBits(), Operand(reg)); 2676851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(static_cast<uint8_t>(v64 & 0xFF)); 2677851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2678851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Not representable, use full immediate. 2679851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x69); 26803f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitOperand(dst.LowBits(), Operand(reg)); 2681851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitImmediate(imm); 2682851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 268334bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 268434bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 268534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister reg, const Address& address) { 268634bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 268734bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRex64(reg, address); 268834bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0x0F); 268934bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0xAF); 269034bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitOperand(reg.LowBits(), address); 269134bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 269234bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 269334bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 2694dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister reg) { 2695fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2696dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2697fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2698fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, Operand(reg)); 2699fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2700fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2701fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27020f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchezvoid X86_64Assembler::imulq(CpuRegister reg) { 27030f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez AssemblerBuffer::EnsureCapacity ensured(&buffer_); 27040f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitRex64(reg); 27050f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitUint8(0xF7); 27060f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitOperand(5, Operand(reg)); 27070f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez} 27080f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez 27090f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez 2710fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::imull(const Address& address) { 2711fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2712dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2713fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2714fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, address); 2715fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2716fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2717fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2718dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::mull(CpuRegister reg) { 2719fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2720dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2721fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2722fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, Operand(reg)); 2723fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2724fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2725fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2726fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mull(const Address& address) { 2727fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2728dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2729fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2730fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, address); 2731fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2732fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2733fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2734dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shll(CpuRegister reg, const Immediate& imm) { 27351a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 4, reg, imm); 2736fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2737fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2738fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27399aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shlq(CpuRegister reg, const Immediate& imm) { 27409aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 4, reg, imm); 27419aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 27429aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27439aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 2744dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shll(CpuRegister operand, CpuRegister shifter) { 27459aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 4, operand, shifter); 27469aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 27479aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27489aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27499aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shlq(CpuRegister operand, CpuRegister shifter) { 27509aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 4, operand, shifter); 2751fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2752fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2753fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2754dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shrl(CpuRegister reg, const Immediate& imm) { 27551a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 5, reg, imm); 27561a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray} 27571a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray 27581a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray 27591a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffrayvoid X86_64Assembler::shrq(CpuRegister reg, const Immediate& imm) { 27601a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(true, 5, reg, imm); 2761fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2762fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2763fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2764dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shrl(CpuRegister operand, CpuRegister shifter) { 27659aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 5, operand, shifter); 27669aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 27679aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27689aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27699aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shrq(CpuRegister operand, CpuRegister shifter) { 27709aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 5, operand, shifter); 2771fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2772fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2773fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2774dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::sarl(CpuRegister reg, const Immediate& imm) { 27751a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 7, reg, imm); 2776fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2777fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2778fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2779dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::sarl(CpuRegister operand, CpuRegister shifter) { 27809aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 7, operand, shifter); 27819aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 27829aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27839aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27849aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::sarq(CpuRegister reg, const Immediate& imm) { 27859aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 7, reg, imm); 27869aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 27879aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27889aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 27899aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::sarq(CpuRegister operand, CpuRegister shifter) { 27909aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 7, operand, shifter); 2791fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2792fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2793fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2794bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::roll(CpuRegister reg, const Immediate& imm) { 2795bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 0, reg, imm); 2796bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2797bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2798bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2799bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::roll(CpuRegister operand, CpuRegister shifter) { 2800bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 0, operand, shifter); 2801bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2802bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2803bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2804bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorl(CpuRegister reg, const Immediate& imm) { 2805bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 1, reg, imm); 2806bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2807bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2808bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2809bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorl(CpuRegister operand, CpuRegister shifter) { 2810bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 1, operand, shifter); 2811bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2812bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2813bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2814bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rolq(CpuRegister reg, const Immediate& imm) { 2815bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 0, reg, imm); 2816bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2817bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2818bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2819bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rolq(CpuRegister operand, CpuRegister shifter) { 2820bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 0, operand, shifter); 2821bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2822bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2823bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2824bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorq(CpuRegister reg, const Immediate& imm) { 2825bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 1, reg, imm); 2826bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2827bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2828bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2829bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorq(CpuRegister operand, CpuRegister shifter) { 2830bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 1, operand, shifter); 2831bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2832bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2833bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2834dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::negl(CpuRegister reg) { 2835fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2836dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2837fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2838fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, Operand(reg)); 2839fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2840fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2841705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 28422e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillainvoid X86_64Assembler::negq(CpuRegister reg) { 28432e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 28442e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitRex64(reg); 28452e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitUint8(0xF7); 28462e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitOperand(3, Operand(reg)); 28472e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain} 28482e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain 2849fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2850dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::notl(CpuRegister reg) { 2851fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2852dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2853fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2854dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xD0 | reg.LowBits()); 2855fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2856fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2857fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2858705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillainvoid X86_64Assembler::notq(CpuRegister reg) { 2859705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2860705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitRex64(reg); 2861705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitUint8(0xF7); 2862705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitOperand(2, Operand(reg)); 2863705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain} 2864705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 2865705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 2866fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::enter(const Immediate& imm) { 2867fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2868fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC8); 2869ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe CHECK(imm.is_uint16()) << imm.value(); 2870fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 2871fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((imm.value() >> 8) & 0xFF); 2872fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x00); 2873fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2874fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2875fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2876fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::leave() { 2877fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2878fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC9); 2879fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2880fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2881fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2882fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ret() { 2883fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2884fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC3); 2885fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2886fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2887fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2888fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ret(const Immediate& imm) { 2889fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2890fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC2); 2891fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_uint16()); 2892fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 2893fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((imm.value() >> 8) & 0xFF); 2894fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2895fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2896fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2897fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2898fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::nop() { 2899fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2900fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x90); 2901fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2902fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2903fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2904fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::int3() { 2905fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2906fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xCC); 2907fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2908fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2909fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2910fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::hlt() { 2911fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2912fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF4); 2913fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2914fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2915fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2916fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::j(Condition condition, Label* label) { 2917fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2918fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 2919fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kShortSize = 2; 2920fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kLongSize = 6; 2921fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 2922fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 2923ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 2924fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x70 + condition); 2925fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((offset - kShortSize) & 0xFF); 2926fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2927fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2928fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x80 + condition); 2929fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - kLongSize); 2930fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2931fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2932fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2933fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x80 + condition); 2934fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 2935fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2936fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2937fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2938fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 293973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::j(Condition condition, NearLabel* label) { 294073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 294173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 294273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 294373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 294473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 294573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 294673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 294773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 294873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 294973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 295073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 295173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 295273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 295373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 295473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 295573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::jrcxz(NearLabel* label) { 295673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 295773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 295873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 295973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 296073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 296173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 296273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 296373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 296473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 296573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 296673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 296773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 296873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 296973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 297073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 2971dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::jmp(CpuRegister reg) { 2972fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2973dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2974fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 2975dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(4, reg.LowBits()); 2976fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2977fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2978fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::jmp(const Address& address) { 2979fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2980dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2981fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 2982fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, address); 2983fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2984fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2985fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::jmp(Label* label) { 2986fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2987fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 2988fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kShortSize = 2; 2989fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kLongSize = 5; 2990fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 2991fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 2992ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 2993fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xEB); 2994fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((offset - kShortSize) & 0xFF); 2995fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2996fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE9); 2997fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - kLongSize); 2998fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2999fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3000fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE9); 3001fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 3002fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3003fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3004fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3005fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 300673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::jmp(NearLabel* label) { 300773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 300873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 300973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 301073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 301173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 301273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 301373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 301473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 301573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 301673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 301773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 301873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 301973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 302073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 302173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 3022b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86_64Assembler::rep_movsw() { 3023b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3024b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 3025b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 3026b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 3027b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 3028b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 3029b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 3030fca82208f7128fcda09b6a4743199308332558a2Dmitry PetrochenkoX86_64Assembler* X86_64Assembler::lock() { 3031fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3032fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF0); 3033fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return this; 3034fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3035fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3036fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3037dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpxchgl(const Address& address, CpuRegister reg) { 3038fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 303958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOptionalRex32(reg, address); 304058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 304158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xB1); 304258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(reg.LowBits(), address); 304358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 304458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 304558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 304658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86_64Assembler::cmpxchgq(const Address& address, CpuRegister reg) { 304758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 304858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitRex64(reg, address); 3049fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3050fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB1); 3051dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 3052fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3053fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 305458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 3055fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mfence() { 3056fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3057fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3058fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAE); 3059fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF0); 3060fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3061fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 30625a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 3063fca82208f7128fcda09b6a4743199308332558a2Dmitry PetrochenkoX86_64Assembler* X86_64Assembler::gs() { 30645a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // TODO: gs is a prefix and not an instruction 3065fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3066fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x65); 3067fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return this; 3068fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3069fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 30705a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 3071dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::AddImmediate(CpuRegister reg, const Immediate& imm) { 3072fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int value = imm.value(); 3073dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (value != 0) { 3074dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (value > 0) { 3075fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko addl(reg, imm); 3076dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else { 3077fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko subl(reg, Immediate(value)); 3078fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3079fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3080fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3081fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3082fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 30835a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::setcc(Condition condition, CpuRegister dst) { 30845a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 30855a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // RSP, RBP, RDI, RSI need rex prefix (else the pattern encodes ah/bh/ch/dh). 30865a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe if (dst.NeedsRex() || dst.AsRegister() > 3) { 30875a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitOptionalRex(true, false, false, false, dst.NeedsRex()); 30885a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 30895a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x0F); 30905a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x90 + condition); 30915a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xC0 + dst.LowBits()); 30925a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 30935a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 309471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::bswapl(CpuRegister dst) { 309571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 309671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, false, false, false, dst.NeedsRex()); 309771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 309871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0xC8 + dst.LowBits()); 309971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 310071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 310171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::bswapq(CpuRegister dst) { 310271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 310371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, true, false, false, dst.NeedsRex()); 310471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 310571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0xC8 + dst.LowBits()); 310671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 310771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 3108bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfl(CpuRegister dst, CpuRegister src) { 3109bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3110bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOptionalRex32(dst, src); 3111bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3112bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3113bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3114bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3115bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3116bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfl(CpuRegister dst, const Address& src) { 3117bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3118bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOptionalRex32(dst, src); 3119bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3120bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3121bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOperand(dst.LowBits(), src); 3122bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3123bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3124bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfq(CpuRegister dst, CpuRegister src) { 3125bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3126bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRex64(dst, src); 3127bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3128bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3129bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3130bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3131bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3132bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfq(CpuRegister dst, const Address& src) { 3133bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3134bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRex64(dst, src); 3135bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3136bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3137bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOperand(dst.LowBits(), src); 3138bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3139bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 31408ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrl(CpuRegister dst, CpuRegister src) { 31418ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31428ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOptionalRex32(dst, src); 31438ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 31448ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 31458ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 31468ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 31478ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 31488ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrl(CpuRegister dst, const Address& src) { 31498ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31508ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOptionalRex32(dst, src); 31518ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 31528ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 31538ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst.LowBits(), src); 31548ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 31558ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 31568ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrq(CpuRegister dst, CpuRegister src) { 31578ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31588ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRex64(dst, src); 31598ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 31608ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 31618ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 31628ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 31638ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 31648ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrq(CpuRegister dst, const Address& src) { 31658ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31668ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRex64(dst, src); 31678ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 31688ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 31698ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst.LowBits(), src); 31708ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 31715a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 31723f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntl(CpuRegister dst, CpuRegister src) { 31733f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31743f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 31753f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOptionalRex32(dst, src); 31763f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 31773f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 31783f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRegisterOperand(dst.LowBits(), src.LowBits()); 31793f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 31803f67e692860d281858485d48a4f1f81b907f1444Aart Bik 31813f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntl(CpuRegister dst, const Address& src) { 31823f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31833f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 31843f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOptionalRex32(dst, src); 31853f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 31863f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 31873f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOperand(dst.LowBits(), src); 31883f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 31893f67e692860d281858485d48a4f1f81b907f1444Aart Bik 31903f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntq(CpuRegister dst, CpuRegister src) { 31913f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31923f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 31933f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRex64(dst, src); 31943f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 31953f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 31963f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRegisterOperand(dst.LowBits(), src.LowBits()); 31973f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 31983f67e692860d281858485d48a4f1f81b907f1444Aart Bik 31993f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntq(CpuRegister dst, const Address& src) { 32003f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32013f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 32023f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRex64(dst, src); 32033f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 32043f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 32053f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOperand(dst.LowBits(), src); 32063f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 32073f67e692860d281858485d48a4f1f81b907f1444Aart Bik 3208b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86_64Assembler::repne_scasb() { 3209b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3210b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xF2); 3211b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xAE); 3212b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo} 3213b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 321421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86_64Assembler::repne_scasw() { 321521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 321621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 321721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 321821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 321921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 322021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 322171311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86_64Assembler::repe_cmpsw() { 322271311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 322371311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 322471311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 322571311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 322671311f868e2579fa5d40b24e620198734119d1a0agicsaki} 322771311f868e2579fa5d40b24e620198734119d1a0agicsaki 322871311f868e2579fa5d40b24e620198734119d1a0agicsaki 3229970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86_64Assembler::repe_cmpsl() { 3230970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3231970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 3232970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 3233970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 3234970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 3235970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 32363fd0e6a86430bf060c7eb391c1378394c4a2c574agicsakivoid X86_64Assembler::repe_cmpsq() { 32373fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32383fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitUint8(0xF3); 32393fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitRex64(); 32403fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitUint8(0xA7); 32413fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki} 32423fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki 32433fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki 3244fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 3245fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // TODO: Need to have a code constants table. 3246fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int64_t constant = bit_cast<int64_t, double>(value); 3247fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko pushq(Immediate(High32Bits(constant))); 3248fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko pushq(Immediate(Low32Bits(constant))); 3249dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers movsd(dst, Address(CpuRegister(RSP), 0)); 325013735955f39b3b304c37d2b2840663c131262c18Ian Rogers addq(CpuRegister(RSP), Immediate(2 * sizeof(intptr_t))); 3251fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3252fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3253fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3254fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::Align(int alignment, int offset) { 3255fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(IsPowerOfTwo(alignment)); 3256fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit nop instruction until the real position is aligned. 3257fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 3258fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko nop(); 3259fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3260fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3261fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3262fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3263fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::Bind(Label* label) { 3264fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int bound = buffer_.Size(); 3265fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(!label->IsBound()); // Labels can only be bound once. 3266fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko while (label->IsLinked()) { 3267fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int position = label->LinkPosition(); 3268fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int next = buffer_.Load<int32_t>(position); 3269fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko buffer_.Store<int32_t>(position, bound - (position + 4)); 3270fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->position_ = next; 3271fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3272fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->BindTo(bound); 3273fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3274fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3275fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 327673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::Bind(NearLabel* label) { 327773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 327873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 327973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 328073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 328173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 328273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 328373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 328473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 328573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 328673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 328773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 328873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 328973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 329073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 3291dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOperand(uint8_t reg_or_opcode, const Operand& operand) { 3292fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GE(reg_or_opcode, 0); 3293fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(reg_or_opcode, 8); 3294fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const int length = operand.length_; 3295fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GT(length, 0); 3296fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit the ModRM byte updated with the given reg value. 3297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_EQ(operand.encoding_[0] & 0x38, 0); 3298fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 3299fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit the rest of the encoded operand. 3300fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko for (int i = 1; i < length; i++) { 3301fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(operand.encoding_[i]); 3302fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3303f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell AssemblerFixup* fixup = operand.GetFixup(); 3304f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (fixup != nullptr) { 3305f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell EmitFixup(fixup); 3306f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3307fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3308fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3309fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::EmitImmediate(const Immediate& imm) { 33115a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe if (imm.is_int32()) { 33125a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt32(static_cast<int32_t>(imm.value())); 33135a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } else { 33145a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt64(imm.value()); 33155a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 3316fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3317fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3319dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitComplex(uint8_t reg_or_opcode, 3320dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const Operand& operand, 3321dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const Immediate& immediate) { 3322fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GE(reg_or_opcode, 0); 3323fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(reg_or_opcode, 8); 3324fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (immediate.is_int8()) { 3325fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use sign-extended 8-bit immediate. 3326fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x83); 3327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, operand); 3328fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(immediate.value() & 0xFF); 3329dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else if (operand.IsRegister(CpuRegister(RAX))) { 3330fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use short form if the destination is eax. 3331fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x05 + (reg_or_opcode << 3)); 3332fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 3333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3334fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x81); 3335fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, operand); 3336fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 3337fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3338fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3339fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3340fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3341fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::EmitLabel(Label* label, int instruction_size) { 3342fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 3343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 3344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 3345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - instruction_size); 3346fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 3348fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3349fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3350fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3352fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::EmitLabelLink(Label* label) { 3353fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(!label->IsBound()); 3354fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int position = buffer_.Size(); 3355fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(label->position_); 3356fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->LinkTo(position); 3357fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3358fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3359fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 336073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::EmitLabelLink(NearLabel* label) { 336173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 336273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 336373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 336473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 336573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 336673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 336773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 336873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 336973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 337073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 337173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 337273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 337373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 337473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 33751a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffrayvoid X86_64Assembler::EmitGenericShift(bool wide, 33761a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray int reg_or_opcode, 33771a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister reg, 33781a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray const Immediate& imm) { 3379fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3380fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_int8()); 33811a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray if (wide) { 33821a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitRex64(reg); 3383851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 3384851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(reg); 33851a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray } 3386fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (imm.value() == 1) { 3387fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD1); 3388fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(reg)); 3389fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3390fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC1); 3391fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(reg)); 3392fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 3393fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3394fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3395fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3396fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 33979aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::EmitGenericShift(bool wide, 33989aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle int reg_or_opcode, 33991a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister operand, 34001a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister shifter) { 3401fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3402dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers CHECK_EQ(shifter.AsRegister(), RCX); 34039aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle if (wide) { 34049aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRex64(operand); 34059aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle } else { 34069aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitOptionalRex32(operand); 34079aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle } 3408fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD3); 3409fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(operand)); 3410fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3411fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3412dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex(bool force, bool w, bool r, bool x, bool b) { 3413dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // REX.WRXB 3414dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // W - 64-bit operand 3415dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // R - MODRM.reg 3416dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // X - SIB.index 3417dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // B - MODRM.rm/SIB.base 3418dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = force ? 0x40 : 0; 3419dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 3420dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x48; // REX.W000 3421dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3422dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (r) { 3423dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x44; // REX.0R00 3424dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3425dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (x) { 3426dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x42; // REX.00X0 3427dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3428dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (b) { 3429dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x41; // REX.000B 3430dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3431dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (rex != 0) { 3432dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(rex); 3433dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3434dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3435dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3436dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister reg) { 3437fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 3438dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3439dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3440dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, CpuRegister src) { 3441dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3442dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3443dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3444dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, XmmRegister src) { 3445dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3446dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3447dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3448dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, XmmRegister src) { 3449dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3450dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3451dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3452dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, CpuRegister src) { 3453dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3454dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3455dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3456dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(const Operand& operand) { 3457790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3458790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3459790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3460790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3461dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3462dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3463dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, const Operand& operand) { 3464790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3465790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3466790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3467790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3468790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3469790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3470790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3471dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3472dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3473dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, const Operand& operand) { 3474790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3475790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3476790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3477790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3478790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3479790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3480790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3481dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3482dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3483d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::EmitRex64() { 3484d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex(false, true, false, false, false); 3485d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 3486d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 3487dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister reg) { 3488fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov EmitOptionalRex(false, true, false, false, reg.NeedsRex()); 3489dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3490fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov 3491d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::EmitRex64(const Operand& operand) { 3492d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle uint8_t rex = operand.rex(); 3493d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle rex |= 0x48; // REX.W000 3494d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(rex); 3495d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 3496d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 3497dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister dst, CpuRegister src) { 3498dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3499dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3500dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3501102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffrayvoid X86_64Assembler::EmitRex64(XmmRegister dst, CpuRegister src) { 3502102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3503102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray} 3504102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray 3505624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillainvoid X86_64Assembler::EmitRex64(CpuRegister dst, XmmRegister src) { 3506624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3507624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain} 3508624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 3509dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister dst, const Operand& operand) { 3510790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = 0x48 | operand.rex(); // REX.W000 3511790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3512790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3513790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 351440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(rex); 351540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 351640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 351740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::EmitRex64(XmmRegister dst, const Operand& operand) { 351840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell uint8_t rex = 0x48 | operand.rex(); // REX.W000 351940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (dst.NeedsRex()) { 352040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell rex |= 0x44; // REX.0R00 3521790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 352240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(rex); 3523dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3525dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, CpuRegister src) { 3526d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // For src, SPL, BPL, SIL, DIL need the rex prefix. 3527d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu bool force = src.AsRegister() > 3; 3528d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex(force, false, dst.NeedsRex(), false, src.NeedsRex()); 3529dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3530dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, const Operand& operand) { 3532d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu uint8_t rex = operand.rex(); 3533d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // For dst, SPL, BPL, SIL, DIL need the rex prefix. 3534d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu bool force = dst.AsRegister() > 3; 3535d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu if (force) { 3536d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu rex |= 0x40; // REX.0000 3537d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu } 3538790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3539790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3540790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3541790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3542790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3543790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3544dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3545dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3546f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendellvoid X86_64Assembler::AddConstantArea() { 354793205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 354839dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 3549f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3550f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell EmitInt32(area[i]); 3551f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3552f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3553f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 35549c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) { 35559c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell size_t result = buffer_.size() * elem_size_; 35569c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell buffer_.push_back(v); 35579c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell return result; 35589c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell} 35599c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell 35609c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) { 35619c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell // Look for an existing match. 356239dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 3563f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (v == buffer_[i]) { 3564f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return i * elem_size_; 3565f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3566f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3567f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3568f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Didn't match anything. 35699c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell return AppendInt32(v); 3570f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3571f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 35729c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) { 3573f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell int32_t v_low = v; 3574f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell int32_t v_high = v >> 32; 3575f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (buffer_.size() > 1) { 3576f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Ensure we don't pass the end of the buffer. 357739dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 357839dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 3579f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return i * elem_size_; 3580f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3581f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3582f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3583f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3584f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Didn't match anything. 35859c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell size_t result = buffer_.size() * elem_size_; 3586f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell buffer_.push_back(v_low); 3587f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell buffer_.push_back(v_high); 3588f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return result; 3589f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3590f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 35919c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddDouble(double v) { 3592f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Treat the value as a 64-bit integer value. 3593f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 3594f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3595f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 35969c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddFloat(float v) { 3597f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Treat the value as a 32-bit integer value. 3598f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 3599f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3600f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3601fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} // namespace x86_64 3602fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} // namespace art 3603