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 39f7754e861f0dec2d4772d61102fa93252258f672Aart Bikstd::ostream& operator<<(std::ostream& os, const Address& addr) { 40f7754e861f0dec2d4772d61102fa93252258f672Aart Bik switch (addr.mod()) { 41f7754e861f0dec2d4772d61102fa93252258f672Aart Bik case 0: 42f7754e861f0dec2d4772d61102fa93252258f672Aart Bik if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 43f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << "(%" << addr.cpu_rm() << ")"; 44f7754e861f0dec2d4772d61102fa93252258f672Aart Bik } else if (addr.base() == RBP) { 45f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << static_cast<int>(addr.disp32()) << "(,%" << addr.cpu_index() 46f7754e861f0dec2d4772d61102fa93252258f672Aart Bik << "," << (1 << addr.scale()) << ")"; 47f7754e861f0dec2d4772d61102fa93252258f672Aart Bik } 48f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << "(%" << addr.cpu_base() << ",%" 49f7754e861f0dec2d4772d61102fa93252258f672Aart Bik << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 50f7754e861f0dec2d4772d61102fa93252258f672Aart Bik case 1: 51f7754e861f0dec2d4772d61102fa93252258f672Aart Bik if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 52f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << static_cast<int>(addr.disp8()) << "(%" << addr.cpu_rm() << ")"; 53f7754e861f0dec2d4772d61102fa93252258f672Aart Bik } 54f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << static_cast<int>(addr.disp8()) << "(%" << addr.cpu_base() << ",%" 55f7754e861f0dec2d4772d61102fa93252258f672Aart Bik << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 56f7754e861f0dec2d4772d61102fa93252258f672Aart Bik case 2: 57f7754e861f0dec2d4772d61102fa93252258f672Aart Bik if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 58f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << static_cast<int>(addr.disp32()) << "(%" << addr.cpu_rm() << ")"; 59f7754e861f0dec2d4772d61102fa93252258f672Aart Bik } 60f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << static_cast<int>(addr.disp32()) << "(%" << addr.cpu_base() << ",%" 61f7754e861f0dec2d4772d61102fa93252258f672Aart Bik << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 62f7754e861f0dec2d4772d61102fa93252258f672Aart Bik default: 63f7754e861f0dec2d4772d61102fa93252258f672Aart Bik return os << "<address?>"; 64f7754e861f0dec2d4772d61102fa93252258f672Aart Bik } 65f7754e861f0dec2d4772d61102fa93252258f672Aart Bik} 66f7754e861f0dec2d4772d61102fa93252258f672Aart Bik 67dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::call(CpuRegister reg) { 68fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 69dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 70fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 71dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(2, reg.LowBits()); 72fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 73fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 74fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 75fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::call(const Address& address) { 76fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 78fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 79fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(2, address); 80fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 81fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 82fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 83fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::call(Label* label) { 84fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE8); 86fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kSize = 5; 871cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray // Offset by one because we already have emitted the opcode. 881cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray EmitLabel(label, kSize - 1); 89fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 90fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 91dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::pushq(CpuRegister reg) { 92fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 94dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0x50 + reg.LowBits()); 95fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 96fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 97fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 98fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::pushq(const Address& address) { 99fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 101fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(6, address); 103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 104fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 105fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 106fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::pushq(const Immediate& imm) { 107fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1085a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // pushq only supports 32b immediate. 109fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (imm.is_int8()) { 110fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x6A); 111fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 112fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 113fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x68); 114fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 116fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 117fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 118fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 119dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::popq(CpuRegister reg) { 120fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 122dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0x58 + reg.LowBits()); 123fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 124fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 125fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 126fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::popq(const Address& address) { 127fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 128dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 129fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8F); 130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, address); 131fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 132fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 133fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 134dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, const Immediate& imm) { 135fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1365a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe if (imm.is_int32()) { 1375a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 32 bit. Note: sign-extends. 1385a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 1395a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xC7); 1405a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(0, dst.LowBits()); 1415a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt32(static_cast<int32_t>(imm.value())); 1425a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } else { 1435a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 1445a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xB8 + dst.LowBits()); 1455a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt64(imm.value()); 1465a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 147fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 148fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 150dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, const Immediate& imm) { 151946e143941d456a4ec666f7f54719c65c5aa3f5dRoland Levillain CHECK(imm.is_int32()); 152fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 153dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 154dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xB8 + dst.LowBits()); 155fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 156fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 157fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 158fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 15940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::movq(const Address& dst, const Immediate& imm) { 16040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell CHECK(imm.is_int32()); 16140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst); 16340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xC7); 16440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(0, dst); 16540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitImmediate(imm); 16640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 16740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 16840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 169dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, CpuRegister src) { 170fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1715a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 0x89 is movq r/m64 <- r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 1725a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(src, dst); 173fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 174dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(src.LowBits(), dst.LowBits()); 175fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 176fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 177fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 178dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, CpuRegister src) { 179fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 180dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 181ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitUint8(0x8B); 182ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitRegisterOperand(dst.LowBits(), src.LowBits()); 183fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 184fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 185fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 186dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(CpuRegister dst, const Address& src) { 187fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 188dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(dst, src); 189fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8B); 190dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 191fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 192fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 194dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(CpuRegister dst, const Address& src) { 195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 196dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 197fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8B); 198dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 199fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 200fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 201fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 202dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movq(const Address& dst, CpuRegister src) { 203fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 204dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(src, dst); 205fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 206dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 207fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 208fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 209fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 210dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movl(const Address& dst, CpuRegister src) { 211fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 212dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 213fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 214dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 215fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 216fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 217fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movl(const Address& dst, const Immediate& imm) { 218fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 219dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 220fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC7); 221fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, dst); 222fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(imm); 223fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 224fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2257a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86_64Assembler::movntl(const Address& dst, CpuRegister src) { 2267a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2277a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOptionalRex32(src, dst); 2287a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0x0F); 2297a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0xC3); 2307a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOperand(src.LowBits(), dst); 2317a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell} 2327a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell 2337a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86_64Assembler::movntq(const Address& dst, CpuRegister src) { 2347a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2357a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitRex64(src, dst); 2367a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0x0F); 2377a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0xC3); 2387a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOperand(src.LowBits(), dst); 2397a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell} 24071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 24171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src) { 24271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe cmov(c, dst, src, true); 24371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 24471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 24571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src, bool is64bit) { 24671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 24871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 24971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x40 + c); 25071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitRegisterOperand(dst.LowBits(), src.LowBits()); 25171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 25271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 25371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 254abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendellvoid X86_64Assembler::cmov(Condition c, CpuRegister dst, const Address& src, bool is64bit) { 255abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 256abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell if (is64bit) { 257abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitRex64(dst, src); 258abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell } else { 259abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitOptionalRex32(dst, src); 260abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell } 261abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x0F); 262abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x40 + c); 263abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitOperand(dst.LowBits(), src); 264abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell} 265abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 266abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 267dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxb(CpuRegister dst, CpuRegister src) { 268fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 269dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(dst, src); 270fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 271fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB6); 272dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 273fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 274fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 275fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 276dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxb(CpuRegister dst, const Address& src) { 277fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 278d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // Byte register is only in the source register form, so we don't use 279d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // EmitOptionalByteRegNormalizingRex32(dst, src); 280d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex32(dst, src); 281fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 282fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB6); 283dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 284fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 285fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 286fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 287dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxb(CpuRegister dst, CpuRegister src) { 288fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 289dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(dst, src); 290fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 291fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBE); 292dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 293fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 294fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 295fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 296dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxb(CpuRegister dst, const Address& src) { 297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 298d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // Byte register is only in the source register form, so we don't use 299d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // EmitOptionalByteRegNormalizingRex32(dst, src); 300d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex32(dst, src); 301fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 302fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBE); 303dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 304fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 305fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 306fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 307dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movb(CpuRegister /*dst*/, const Address& /*src*/) { 308fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko LOG(FATAL) << "Use movzxb or movsxb instead."; 309fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 311fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 312dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movb(const Address& dst, CpuRegister src) { 313fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 314dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalByteRegNormalizingRex32(src, dst); 315fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x88); 316dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 317fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 319fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 320fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movb(const Address& dst, const Immediate& imm) { 321fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOptionalRex32(dst); 323fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC6); 324dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(Register::RAX, dst); 325fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_int8()); 326fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 328fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 329fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 330dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxw(CpuRegister dst, CpuRegister src) { 331fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 332dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 334fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB7); 335dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 336fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 337fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 338fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 339dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movzxw(CpuRegister dst, const Address& src) { 340fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 341dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 342fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB7); 344dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 346fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 348dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxw(CpuRegister dst, CpuRegister src) { 349fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 350dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 352fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBF); 353dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 354fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 355fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 356fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 357dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movsxw(CpuRegister dst, const Address& src) { 358fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 359dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 360fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 361fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xBF); 362dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 363fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 364fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 365fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 366dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movw(CpuRegister /*dst*/, const Address& /*src*/) { 367fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko LOG(FATAL) << "Use movzxw or movsxw instead."; 368fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 369fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 370fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 371dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movw(const Address& dst, CpuRegister src) { 372fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 373fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperandSizeOverride(); 374e4ded41ae2648973d5fed8c6bafaebf917ea7d17Nicolas Geoffray EmitOptionalRex32(src, dst); 375fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x89); 376dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 377fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 378fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 379fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 38026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86_64Assembler::movw(const Address& dst, const Immediate& imm) { 38126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 38226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 38326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOptionalRex32(dst); 38426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 38526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(Register::RAX, dst); 386b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 38726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 38826a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 38926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 39026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 39126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 392dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::leaq(CpuRegister dst, const Address& src) { 393fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 394dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(dst, src); 395fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x8D); 396dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 397fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 398fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 399fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 400748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffrayvoid X86_64Assembler::leal(CpuRegister dst, const Address& src) { 401748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 402748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitOptionalRex32(dst, src); 403748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitUint8(0x8D); 404748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray EmitOperand(dst.LowBits(), src); 405748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray} 406748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray 407748f140d5f0631780dbeecb033c1416faf78930dNicolas Geoffray 4087fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86_64Assembler::movaps(XmmRegister dst, XmmRegister src) { 4097fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 4107fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitOptionalRex32(dst, src); 4117fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 4127fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 413102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray EmitXmmRegisterOperand(dst.LowBits(), src); 4147fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 4157fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 4167fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 417c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movaps(XmmRegister dst, const Address& src) { 418c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 419c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 420c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 421c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 422c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 423c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 424c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 425c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 426c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movups(XmmRegister dst, const Address& src) { 427c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 428c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 429c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 430c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 431c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 432c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 433c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 434c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 435c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movaps(const Address& dst, XmmRegister src) { 436c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 437c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 438c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 439c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 440c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 441c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 442c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 443c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 444c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movups(const Address& dst, XmmRegister src) { 445c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 446c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 447c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 448c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 449c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 450c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 451c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 452c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 453fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(XmmRegister dst, const Address& src) { 454fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 455fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 456dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 457fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 458fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x10); 459dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 460fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 461fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 462fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 463fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(const Address& dst, XmmRegister src) { 464fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 465fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 466dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 467fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 468fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 469dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 470fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 471fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 472fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 473fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movss(XmmRegister dst, XmmRegister src) { 474fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 475fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 476851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); // Movss is MR encoding instead of the usual RM. 477fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 478fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 479dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(src.LowBits(), dst); 480fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 481fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 482fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 483dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillainvoid X86_64Assembler::movsxd(CpuRegister dst, CpuRegister src) { 484dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 48557a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray EmitRex64(dst, src); 486dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitUint8(0x63); 487dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitRegisterOperand(dst.LowBits(), src.LowBits()); 488dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain} 489dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 490dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 491dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillainvoid X86_64Assembler::movsxd(CpuRegister dst, const Address& src) { 492dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 4937fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(dst, src); 494dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitUint8(0x63); 495dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain EmitOperand(dst.LowBits(), src); 496dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain} 497dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 498dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 499dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::movd(XmmRegister dst, CpuRegister src) { 50071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe movd(dst, src, true); 50171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 50271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 50371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(CpuRegister dst, XmmRegister src) { 50471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe movd(dst, src, true); 50571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 50671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 50771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(XmmRegister dst, CpuRegister src, bool is64bit) { 508fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 509fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 51071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 511fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 512fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x6E); 513dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 514fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 515fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 51671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::movd(CpuRegister dst, XmmRegister src, bool is64bit) { 517fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 518fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 51971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, is64bit, src.NeedsRex(), false, dst.NeedsRex()); 520fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 521fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x7E); 522dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), Operand(dst)); 523fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 524fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 525fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 526fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addss(XmmRegister dst, XmmRegister src) { 527fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 528fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 529dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 530fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 531fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 532dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 533fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 534fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 535fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 536fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addss(XmmRegister dst, const Address& src) { 537fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 538fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 540fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 541fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 542dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 543fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 544fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 545fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 546fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subss(XmmRegister dst, XmmRegister src) { 547fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 548fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 549dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 550fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 551fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 552dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 553fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 554fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 555fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 556fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subss(XmmRegister dst, const Address& src) { 557fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 558fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 559dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 560fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 561fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 562dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 563fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 564fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 565fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 566fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulss(XmmRegister dst, XmmRegister src) { 567fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 568fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 569dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 570fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 571fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 572dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 573fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 574fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 575fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 576fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulss(XmmRegister dst, const Address& src) { 577fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 578fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 579dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 580fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 581fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 582dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 583fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 584fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 585fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 586fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divss(XmmRegister dst, XmmRegister src) { 587fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 588fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 589dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 590fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 591fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 592dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 593fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 594fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 595fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 596fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divss(XmmRegister dst, const Address& src) { 597fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 599dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 600fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 601fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 602dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 603fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 604fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 605fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 606c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::addps(XmmRegister dst, XmmRegister src) { 607c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 608c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 609c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 610c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 611c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 612c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 613c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 614c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 615c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::subps(XmmRegister dst, XmmRegister src) { 616c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 617c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 618c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 619c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 620c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 621c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 622c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 623c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 624c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::mulps(XmmRegister dst, XmmRegister src) { 625c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 626c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 627c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 628c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 629c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 630c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 631c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 632c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 633c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::divps(XmmRegister dst, XmmRegister src) { 634c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 635c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 636c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 637c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 638c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 639c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 640c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 641c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 642fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::flds(const Address& src) { 643fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 644fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 645fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, src); 646fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 647fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 648fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 64924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fsts(const Address& dst) { 65024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 65124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 65224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 65324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 65424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 65524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 656fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fstps(const Address& dst) { 657fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 658fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 659fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 660fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 661fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 662fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 663c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(XmmRegister dst, XmmRegister src) { 664c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 665c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 666c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 667c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 668c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 669c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 670c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 671c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 672c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 673c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(XmmRegister dst, const Address& src) { 674c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 675c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 676c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 677c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 678c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 679c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 680c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 681c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 682c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 683c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movupd(XmmRegister dst, const Address& src) { 684c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 685c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 686c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 687c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 688c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 689c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst.LowBits(), src); 690c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 691c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 692c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 693c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movapd(const Address& dst, XmmRegister src) { 694c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 695c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 696c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 697c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 698c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 699c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 700c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 701c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 702c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 703c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::movupd(const Address& dst, XmmRegister src) { 704c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 705c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 706c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(src, dst); 707c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 708c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 709c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src.LowBits(), dst); 710c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 711c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 712c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 713fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(XmmRegister dst, const Address& src) { 714fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 715fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 716dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 717fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 718fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x10); 719dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 720fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 721fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 722fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 723fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(const Address& dst, XmmRegister src) { 724fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 725fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 726dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(src, dst); 727fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 728fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 729dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(src.LowBits(), dst); 730fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 731fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 732fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 733fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::movsd(XmmRegister dst, XmmRegister src) { 734fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 735fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 736851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); // Movsd is MR encoding instead of the usual RM. 737fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 738fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x11); 739dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(src.LowBits(), dst); 740fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 741fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 742fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 743fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addsd(XmmRegister dst, XmmRegister src) { 744fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 745fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 746dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 747fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 748fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 749dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 750fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 751fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 752fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 753fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addsd(XmmRegister dst, const Address& src) { 754fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 755fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 756dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 757fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 758fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x58); 759dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 760fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 761fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 762fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 763fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subsd(XmmRegister dst, XmmRegister src) { 764fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 765fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 766dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 767fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 768fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 769dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 770fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 771fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 772fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 773fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::subsd(XmmRegister dst, const Address& src) { 774fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 775fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 776dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 777fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 778fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5C); 779dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 780fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 781fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 782fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 783fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulsd(XmmRegister dst, XmmRegister src) { 784fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 785fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 786dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 787fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 788fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 789dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 790fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 791fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 792fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 793fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mulsd(XmmRegister dst, const Address& src) { 794fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 795fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 796dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 797fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 798fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x59); 799dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 800fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 801fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 802fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 803fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divsd(XmmRegister dst, XmmRegister src) { 804fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 805fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 806dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 807fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 808fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 809dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 810fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 811fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 812fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 813fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::divsd(XmmRegister dst, const Address& src) { 814fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 815fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 816dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 817fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 818fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5E); 819dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 820fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 821fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 822fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 823c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::addpd(XmmRegister dst, XmmRegister src) { 824c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 825c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 826c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 827c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 828c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 829c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 830c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 831c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 832c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 833c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::subpd(XmmRegister dst, XmmRegister src) { 834c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 835c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 836c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 837c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 838c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 839c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 840c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 841c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 842c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 843c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::mulpd(XmmRegister dst, XmmRegister src) { 844c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 845c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 846c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 847c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 848c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 849c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 850c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 851c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 852c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 853c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86_64Assembler::divpd(XmmRegister dst, XmmRegister src) { 854c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 855c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 856c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOptionalRex32(dst, src); 857c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 858c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 859c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 860c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 861c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 862c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 86368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(XmmRegister dst, XmmRegister src) { 86468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 86668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 86768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 86868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 86968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 87068555e952eea58023fa403951b1491496acf0f4bAart Bik} 87168555e952eea58023fa403951b1491496acf0f4bAart Bik 87268555e952eea58023fa403951b1491496acf0f4bAart Bik 87368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(XmmRegister dst, const Address& src) { 87468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 87568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 87668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 87768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 87868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 87968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst.LowBits(), src); 88068555e952eea58023fa403951b1491496acf0f4bAart Bik} 88168555e952eea58023fa403951b1491496acf0f4bAart Bik 88268555e952eea58023fa403951b1491496acf0f4bAart Bik 88368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqu(XmmRegister dst, const Address& src) { 88468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 88568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 88668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 88768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 88868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 88968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst.LowBits(), src); 89068555e952eea58023fa403951b1491496acf0f4bAart Bik} 89168555e952eea58023fa403951b1491496acf0f4bAart Bik 89268555e952eea58023fa403951b1491496acf0f4bAart Bik 89368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqa(const Address& dst, XmmRegister src) { 89468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 89568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 89668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(src, dst); 89768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 89868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 89968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src.LowBits(), dst); 90068555e952eea58023fa403951b1491496acf0f4bAart Bik} 90168555e952eea58023fa403951b1491496acf0f4bAart Bik 90268555e952eea58023fa403951b1491496acf0f4bAart Bik 90368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::movdqu(const Address& dst, XmmRegister src) { 90468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 90568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 90668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(src, dst); 90768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 90868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 90968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src.LowBits(), dst); 91068555e952eea58023fa403951b1491496acf0f4bAart Bik} 91168555e952eea58023fa403951b1491496acf0f4bAart Bik 91268555e952eea58023fa403951b1491496acf0f4bAart Bik 913e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddb(XmmRegister dst, XmmRegister src) { 914e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 915e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 916e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 917e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 918e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFC); 919e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 920e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 921e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 922e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 923e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubb(XmmRegister dst, XmmRegister src) { 924e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 925e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 926e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 927e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 928e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF8); 929e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 930e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 931e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 932e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 933e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddw(XmmRegister dst, XmmRegister src) { 934e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 935e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 936e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 937e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 938e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFD); 939e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 940e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 941e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 942e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 943e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubw(XmmRegister dst, XmmRegister src) { 944e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 946e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 947e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 948e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF9); 949e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 950e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 951e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 952e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 953e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::pmullw(XmmRegister dst, XmmRegister src) { 954e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 955e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 956e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 957e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 958e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD5); 959e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 960e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 961e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 962e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 96368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::paddd(XmmRegister dst, XmmRegister src) { 96468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 96568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 96668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 96768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 96868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFE); 96968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 97068555e952eea58023fa403951b1491496acf0f4bAart Bik} 97168555e952eea58023fa403951b1491496acf0f4bAart Bik 97268555e952eea58023fa403951b1491496acf0f4bAart Bik 97368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::psubd(XmmRegister dst, XmmRegister src) { 97468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 97568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 97668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 97768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 97868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFA); 97968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 98068555e952eea58023fa403951b1491496acf0f4bAart Bik} 98168555e952eea58023fa403951b1491496acf0f4bAart Bik 98268555e952eea58023fa403951b1491496acf0f4bAart Bik 98368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pmulld(XmmRegister dst, XmmRegister src) { 98468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 98568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 98668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 98768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 98868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x38); 98968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x40); 99068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 99168555e952eea58023fa403951b1491496acf0f4bAart Bik} 99268555e952eea58023fa403951b1491496acf0f4bAart Bik 99368555e952eea58023fa403951b1491496acf0f4bAart Bik 994e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::paddq(XmmRegister dst, XmmRegister src) { 995e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 996e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 997e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 998e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 999e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD4); 1000e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1001e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1002e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1003e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1004e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psubq(XmmRegister dst, XmmRegister src) { 1005e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1006e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1007e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1008e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1009e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFB); 1010e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1011e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1012e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1013e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1014dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src) { 10156d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain cvtsi2ss(dst, src, false); 10166d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain} 10176d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain 10186d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain 10196d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillainvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src, bool is64bit) { 1020fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 10226d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain if (is64bit) { 10236d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 10246d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain EmitRex64(dst, src); 10256d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain } else { 10266d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain EmitOptionalRex32(dst, src); 10276d0e483dd2e0b63e952de060738c10e2abd12ff7Roland Levillain } 1028fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1029fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2A); 1030dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 1031fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1032fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1033fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 103440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsi2ss(XmmRegister dst, const Address& src, bool is64bit) { 103540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 103640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF3); 103740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (is64bit) { 103840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell // Emit a REX.W prefix if the operand size is 64 bits. 103940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 104040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } else { 104140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 104240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } 104340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 104440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2A); 104540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 104640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 104740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 104840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1049dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src) { 1050647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain cvtsi2sd(dst, src, false); 1051647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1052647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1053647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1054647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src, bool is64bit) { 1055fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1056fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1057647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain if (is64bit) { 1058647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 1059647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain EmitRex64(dst, src); 1060647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain } else { 1061647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain EmitOptionalRex32(dst, src); 1062647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain } 1063fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1064fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2A); 1065dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 1066fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1067fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1068fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 106940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsi2sd(XmmRegister dst, const Address& src, bool is64bit) { 107040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 107140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF2); 107240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (is64bit) { 107340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell // Emit a REX.W prefix if the operand size is 64 bits. 107440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 107540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } else { 107640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 107740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell } 107840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 107940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2A); 108040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 108140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 108240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 108340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1084dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtss2si(CpuRegister dst, XmmRegister src) { 1085fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1086fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1087dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1088fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1089fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2D); 1090dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1091fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1092fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1093fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1094fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 1095fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1096fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1097dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1098fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1099fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5A); 1100dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1101fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 110440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtss2sd(XmmRegister dst, const Address& src) { 110540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 110640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF3); 110740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 110840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 110940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x5A); 111040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 111140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 111240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 111340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1114dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvtsd2si(CpuRegister dst, XmmRegister src) { 1115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1116fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1117dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1118fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1119fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2D); 1120dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1121fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1122fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1123fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1124dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src) { 1125624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain cvttss2si(dst, src, false); 1126624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain} 1127624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 1128624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 1129624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillainvoid X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1130fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1131fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1132624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain if (is64bit) { 1133624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 1134624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitRex64(dst, src); 1135624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain } else { 1136624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitOptionalRex32(dst, src); 1137624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain } 1138fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1139fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2C); 1140dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1141fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1142fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1143fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1144dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src) { 11454c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain cvttsd2si(dst, src, false); 11464c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain} 11474c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain 11484c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain 11494c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillainvoid X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1150fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1151fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 11524c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain if (is64bit) { 11534c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain // Emit a REX.W prefix if the operand size is 64 bits. 11544c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain EmitRex64(dst, src); 11554c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain } else { 11564c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain EmitOptionalRex32(dst, src); 11574c0b61f506644bb6b647be05d02c5fb45b9ceb48Roland Levillain } 1158fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1159fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2C); 1160dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1161fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1162fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1163fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1164fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 1165fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1166fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1167dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1168fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1169fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x5A); 1170dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1171fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1172fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1173fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 117440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::cvtsd2ss(XmmRegister dst, const Address& src) { 117540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 117640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0xF2); 117740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(dst, src); 117840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 117940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x5A); 118040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 118140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 118240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 118340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 11843ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bikvoid X86_64Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) { 11853ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11863ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitOptionalRex32(dst, src); 11873ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x0F); 11883ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x5B); 11893ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 11903ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik} 11913ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 11923ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 1193fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 1194fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1195fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1196dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1197fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1198fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE6); 1199dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1200fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1201fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1202fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1203fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::comiss(XmmRegister a, XmmRegister b) { 1204fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1205dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(a, b); 1206fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1207fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2F); 1208dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(a.LowBits(), b); 1209fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1210fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1211fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 121240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::comiss(XmmRegister a, const Address& b) { 121340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 121540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 121640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2F); 121740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 121840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 121940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 122040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1221fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::comisd(XmmRegister a, XmmRegister b) { 1222fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1223fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1224dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(a, b); 1225fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1226fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2F); 1227dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(a.LowBits(), b); 1228fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1229fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 123040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 123140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::comisd(XmmRegister a, const Address& b) { 123240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 123340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x66); 123440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 123540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 123640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2F); 123740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 123840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 123940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 124040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1241ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86_64Assembler::ucomiss(XmmRegister a, XmmRegister b) { 1242ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1243ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitOptionalRex32(a, b); 1244ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1245ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1246ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a.LowBits(), b); 1247ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1248ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1249ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 125040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::ucomiss(XmmRegister a, const Address& b) { 125140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 125240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 125340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 125440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2E); 125540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 125640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 125740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 125840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1259ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86_64Assembler::ucomisd(XmmRegister a, XmmRegister b) { 1260ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1261ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 1262ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitOptionalRex32(a, b); 1263ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1264ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1265ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a.LowBits(), b); 1266ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1267ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1268fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 126940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::ucomisd(XmmRegister a, const Address& b) { 127040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 127140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x66); 127240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOptionalRex32(a, b); 127340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0F); 127440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x2E); 127540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(a.LowBits(), b); 127640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 127740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 127840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 1279fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86_64Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1280fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1281fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1282fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitOptionalRex32(dst, src); 1283fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1284fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1285fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 1286fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst.LowBits(), src); 1287fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1288fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1289fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1290fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1291fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86_64Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1292fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1293fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1294fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitOptionalRex32(dst, src); 1295fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1296fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1297fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 1298fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst.LowBits(), src); 1299fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1300fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1301fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1302fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1303fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 1304fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1305fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 1306dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1307fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1308fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x51); 1309dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1310fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1311fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1312fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1313fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 1314fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1315fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF3); 1316dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1317fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x51); 1319dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1320fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1321fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1322fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1323fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorpd(XmmRegister dst, const Address& src) { 1324fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1325fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1326dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1328fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1329dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1330fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1331fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1332fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorpd(XmmRegister dst, XmmRegister src) { 1334fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1335fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1336dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1337fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1338fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1339dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1340fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1341fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1342fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorps(XmmRegister dst, const Address& src) { 1344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1345dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1346fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1348dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1349fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1350fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1352fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::xorps(XmmRegister dst, XmmRegister src) { 1353fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1354dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1355fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1356fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x57); 1357dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitXmmRegisterOperand(dst.LowBits(), src); 1358fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1359fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 1360fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 136168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pxor(XmmRegister dst, XmmRegister src) { 136268555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 136368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 136468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 136568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 136668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEF); 136768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 136868555e952eea58023fa403951b1491496acf0f4bAart Bik} 136968555e952eea58023fa403951b1491496acf0f4bAart Bik 137068555e952eea58023fa403951b1491496acf0f4bAart Bik 1371fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::andpd(XmmRegister dst, const Address& src) { 1372fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1373fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x66); 1374dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 1375fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 1376fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x54); 1377dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), src); 1378fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 1379fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 138071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::andpd(XmmRegister dst, XmmRegister src) { 138171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 138271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x66); 138371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 138471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 138571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x54); 138671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 138771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 138871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 138971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::andps(XmmRegister dst, XmmRegister src) { 139071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 139171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 139271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 139371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x54); 139471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 139571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 139671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 139768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pand(XmmRegister dst, XmmRegister src) { 139868555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 139968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 140068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 140168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 140268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xDB); 140368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 140468555e952eea58023fa403951b1491496acf0f4bAart Bik} 140568555e952eea58023fa403951b1491496acf0f4bAart Bik 140621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::andnpd(XmmRegister dst, XmmRegister src) { 140721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 140821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x66); 140921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 141021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 141121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x55); 141221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 141321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 141421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 141521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::andnps(XmmRegister dst, XmmRegister src) { 141621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 141721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 141821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 141921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x55); 142021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 142121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 142221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 142321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86_64Assembler::pandn(XmmRegister dst, XmmRegister src) { 142421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 142521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x66); 142621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitOptionalRex32(dst, src); 142721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0x0F); 142821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitUint8(0xDF); 142921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 143021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik} 143121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik 143271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::orpd(XmmRegister dst, XmmRegister src) { 143371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 143471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x66); 143571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 143671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 143771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x56); 143871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 143971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 144071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 144171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::orps(XmmRegister dst, XmmRegister src) { 144271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 144371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex32(dst, src); 144471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 144571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x56); 144671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitXmmRegisterOperand(dst.LowBits(), src); 144771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 1448fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 144968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::por(XmmRegister dst, XmmRegister src) { 145068555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 145168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 145268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 145368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 145468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEB); 145568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 145668555e952eea58023fa403951b1491496acf0f4bAart Bik} 145712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 145867d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86_64Assembler::pavgb(XmmRegister dst, XmmRegister src) { 145967d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 146067d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x66); 146167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitOptionalRex32(dst, src); 146267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x0F); 146367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0xE0); 146467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 146567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik} 146667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik 146767d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86_64Assembler::pavgw(XmmRegister dst, XmmRegister src) { 146867d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 146967d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x66); 147067d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitOptionalRex32(dst, src); 147167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0x0F); 147267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitUint8(0xE3); 147367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 147467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik} 147567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik 14766005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::psadbw(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(0xF6); 14826005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14836005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14846005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14856005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::pmaddwd(XmmRegister dst, XmmRegister src) { 14866005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14876005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14886005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14896005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14906005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF5); 14916005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 14926005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 14936005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 14946005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phaddw(XmmRegister dst, XmmRegister src) { 14956005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14966005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 14976005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 14986005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 14996005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 15006005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x01); 15016005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15026005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15036005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15046005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phaddd(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(0x02); 15116005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15126005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15136005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15146005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::haddps(XmmRegister dst, XmmRegister src) { 15156005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15166005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF2); 15176005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15186005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15196005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7C); 15206005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15216005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15226005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15236005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::haddpd(XmmRegister dst, XmmRegister src) { 15246005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15256005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15266005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15276005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15286005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7C); 15296005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15306005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15316005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15326005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phsubw(XmmRegister dst, XmmRegister src) { 15336005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15346005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15356005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15366005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15376005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 15386005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x05); 15396005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15406005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15416005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15426005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::phsubd(XmmRegister dst, XmmRegister src) { 15436005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15446005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15456005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15466005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15476005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x38); 15486005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x06); 15496005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15506005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15516005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15526005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::hsubps(XmmRegister dst, XmmRegister src) { 15536005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15546005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0xF2); 15556005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15566005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15576005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7D); 15586005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15596005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15606005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 15616005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86_64Assembler::hsubpd(XmmRegister dst, XmmRegister src) { 15626005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15636005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x66); 15646005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitOptionalRex32(dst, src); 15656005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x0F); 15666005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitUint8(0x7D); 15676005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 15686005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik} 15696005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik 1570c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsb(XmmRegister dst, XmmRegister src) { 1571c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1572c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1573c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1574c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1575c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1576c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1577c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1578c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1579c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1580c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsb(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(0x3C); 1587c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1588c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1589c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1590c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsw(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(0xEA); 1596c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1597c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1598c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1599c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsw(XmmRegister dst, XmmRegister src) { 1600c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1601c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1602c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1603c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1604c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xEE); 1605c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1606c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1607c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1608c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminsd(XmmRegister dst, XmmRegister src) { 1609c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1610c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1611c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1612c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1613c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1614c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x39); 1615c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1616c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1617c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1618c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxsd(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(0x3D); 1625c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1626c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1627c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1628c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminub(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(0xDA); 1634c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1635c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1636c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1637c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxub(XmmRegister dst, XmmRegister src) { 1638c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1639c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1640c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1641c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1642c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0xDE); 1643c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1644c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1645c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1646c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminuw(XmmRegister dst, XmmRegister src) { 1647c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1648c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1649c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1650c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1651c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1652c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3A); 1653c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1654c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1655c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1656c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxuw(XmmRegister dst, XmmRegister src) { 1657c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1658c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1659c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1660c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1661c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1662c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3E); 1663c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1664c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1665c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1666c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pminud(XmmRegister dst, XmmRegister src) { 1667c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1668c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1669c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1670c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1671c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1672c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3B); 1673c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1674c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1675c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1676c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::pmaxud(XmmRegister dst, XmmRegister src) { 1677c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1678c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1679c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1680c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1681c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x38); 1682c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x3F); 1683c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1684c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1685c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1686c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::minps(XmmRegister dst, XmmRegister src) { 1687c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1688c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1689c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1690c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5D); 1691c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1692c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1693c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1694c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::maxps(XmmRegister dst, XmmRegister src) { 1695c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1696c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1697c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1698c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5F); 1699c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1700c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1701c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1702c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::minpd(XmmRegister dst, XmmRegister src) { 1703c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1704c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1705c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1706c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1707c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5D); 1708c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1709c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1710c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 1711c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86_64Assembler::maxpd(XmmRegister dst, XmmRegister src) { 1712c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1713c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x66); 1714c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitOptionalRex32(dst, src); 1715c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x0F); 1716c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitUint8(0x5F); 1717c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1718c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik} 1719c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik 17204b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) { 17214b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17224b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17234b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17244b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17254b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x74); 17264b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17274b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17284b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17294b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) { 17304b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17314b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17324b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17334b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17344b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x75); 17354b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17364b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17374b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17384b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) { 17394b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17404b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17414b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17424b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17434b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x76); 17444b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17454b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17464b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17474b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86_64Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) { 17484b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17494b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x66); 17504b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitOptionalRex32(dst, src); 17514b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x0F); 17524b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x38); 17534b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitUint8(0x29); 17544b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17554b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik} 17564b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik 17578939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) { 17588939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17598939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17608939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17618939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17628939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x64); 17638939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17648939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17658939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17668939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) { 17678939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17688939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17698939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17708939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17718939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x65); 17728939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17738939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17748939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17758939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) { 17768939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17778939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17788939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17798939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17808939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17818939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17828939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17838939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 17848939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86_64Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) { 17858939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17868939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x66); 17878939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitOptionalRex32(dst, src); 17888939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x0F); 17898939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x38); 17908939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitUint8(0x37); 17918939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 17928939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik} 17938939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik 179412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86_64Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 179512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 179612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x66); 179712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitOptionalRex32(dst, src); 179812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 179912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 180012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 180112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 180212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 180312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 180412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 180512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86_64Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) { 180612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 180712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitOptionalRex32(dst, src); 180812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 180912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 181012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 181112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 181212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 181312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 181412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 181568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86_64Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 181668555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 181768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 181868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOptionalRex32(dst, src); 181968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 182068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x70); 182168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 182268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(imm.value()); 182368555e952eea58023fa403951b1491496acf0f4bAart Bik} 182468555e952eea58023fa403951b1491496acf0f4bAart Bik 182568555e952eea58023fa403951b1491496acf0f4bAart Bik 1826e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklbw(XmmRegister dst, XmmRegister src) { 1827e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1828e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1829e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1830e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1831e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x60); 1832e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1833e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1834e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1835e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1836e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklwd(XmmRegister dst, XmmRegister src) { 1837e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1838e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1839e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1840e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1841e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x61); 1842e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1843e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1844e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1845e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1846e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 1847e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1848e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1849e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1850e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1851e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x62); 1852e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1853e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1854e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1855e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1856e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) { 1857e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1858e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1859e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex32(dst, src); 1860e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1861e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x6C); 1862e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 1863e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1864e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1865e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 18663332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86_64Assembler::punpckhbw(XmmRegister dst, XmmRegister src) { 18673332db8345de39eb5067d99987fcae140184672bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 18683332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x66); 18693332db8345de39eb5067d99987fcae140184672bAart Bik EmitOptionalRex32(dst, src); 18703332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x0F); 18713332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x68); 18723332db8345de39eb5067d99987fcae140184672bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 18733332db8345de39eb5067d99987fcae140184672bAart Bik} 18743332db8345de39eb5067d99987fcae140184672bAart Bik 18753332db8345de39eb5067d99987fcae140184672bAart Bik 18763332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86_64Assembler::punpckhwd(XmmRegister dst, XmmRegister src) { 18773332db8345de39eb5067d99987fcae140184672bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 18783332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x66); 18793332db8345de39eb5067d99987fcae140184672bAart Bik EmitOptionalRex32(dst, src); 18803332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x0F); 18813332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x69); 18823332db8345de39eb5067d99987fcae140184672bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 18833332db8345de39eb5067d99987fcae140184672bAart Bik} 18843332db8345de39eb5067d99987fcae140184672bAart Bik 18853332db8345de39eb5067d99987fcae140184672bAart Bik 18863332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86_64Assembler::punpckhdq(XmmRegister dst, XmmRegister src) { 18873332db8345de39eb5067d99987fcae140184672bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 18883332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x66); 18893332db8345de39eb5067d99987fcae140184672bAart Bik EmitOptionalRex32(dst, src); 18903332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x0F); 18913332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x6A); 18923332db8345de39eb5067d99987fcae140184672bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 18933332db8345de39eb5067d99987fcae140184672bAart Bik} 18943332db8345de39eb5067d99987fcae140184672bAart Bik 18953332db8345de39eb5067d99987fcae140184672bAart Bik 18963332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86_64Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) { 18973332db8345de39eb5067d99987fcae140184672bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 18983332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x66); 18993332db8345de39eb5067d99987fcae140184672bAart Bik EmitOptionalRex32(dst, src); 19003332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x0F); 19013332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x6D); 19023332db8345de39eb5067d99987fcae140184672bAart Bik EmitXmmRegisterOperand(dst.LowBits(), src); 19033332db8345de39eb5067d99987fcae140184672bAart Bik} 19043332db8345de39eb5067d99987fcae140184672bAart Bik 19053332db8345de39eb5067d99987fcae140184672bAart Bik 1906e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psllw(XmmRegister reg, const Immediate& shift_count) { 1907e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1908e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1909e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1910e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1911e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1912e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1913e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1914e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1915e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1916e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1917e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1918e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::pslld(XmmRegister reg, const Immediate& shift_count) { 1919e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1920e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1921e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1922e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1923e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1924e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1925e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1926e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1927e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1928e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1929e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1930e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psllq(XmmRegister reg, const Immediate& shift_count) { 1931e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1932e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1933e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1934e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1935e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1936e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1937e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1938e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1939e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1940e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1941e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1942e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psraw(XmmRegister reg, const Immediate& shift_count) { 1943e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1944e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1945e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1946e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1947e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1948e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1949e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1950e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1951e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1952e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1953e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1954e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrad(XmmRegister reg, const Immediate& shift_count) { 1955e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1956e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1957e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1958e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1959e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1960e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1961e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1962e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1963e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1964e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1965e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1966e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) { 1967e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1968e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1969e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1970e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1971e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1972e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1973e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1974e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1975e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1976e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1977e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1978e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrld(XmmRegister reg, const Immediate& shift_count) { 1979e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1980e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1981e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1982e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1983e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1984e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1985e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1986e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1987e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1988e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1989e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1990e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86_64Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 1991e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1992e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1993e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1994e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1995e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1996e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1997e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1998e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1999e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 2000e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 2001e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 20023332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86_64Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 20033332db8345de39eb5067d99987fcae140184672bAart Bik DCHECK(shift_count.is_uint8()); 20043332db8345de39eb5067d99987fcae140184672bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 20053332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x66); 20063332db8345de39eb5067d99987fcae140184672bAart Bik EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 20073332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x0F); 20083332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(0x73); 20093332db8345de39eb5067d99987fcae140184672bAart Bik EmitXmmRegisterOperand(3, reg); 20103332db8345de39eb5067d99987fcae140184672bAart Bik EmitUint8(shift_count.value()); 20113332db8345de39eb5067d99987fcae140184672bAart Bik} 20123332db8345de39eb5067d99987fcae140184672bAart Bik 20133332db8345de39eb5067d99987fcae140184672bAart Bik 2014fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fldl(const Address& src) { 2015fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2016fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 2017fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, src); 2018fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2019fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2020fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 202124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fstl(const Address& dst) { 202224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 202324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 202424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 202524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 202624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 202724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 2028fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fstpl(const Address& dst) { 2029fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2030fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 2031fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 2032fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2033fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2034fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 203524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fstsw() { 203624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 203724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 203824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 203924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 204024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 204124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 204224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 2043fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fnstcw(const Address& dst) { 2044fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2045fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2046fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(7, dst); 2047fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2048fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2049fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2050fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fldcw(const Address& src) { 2051fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2052fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2053fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, src); 2054fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2055fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2056fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2057fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fistpl(const Address& dst) { 2058fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2059fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDF); 2060fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(7, dst); 2061fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2062fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2063fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2064fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fistps(const Address& dst) { 2065fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2066fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDB); 2067fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, dst); 2068fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2069fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2070fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2071fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fildl(const Address& src) { 2072fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2073fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDF); 2074fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, src); 2075fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2076fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2077fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 20780a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86_64Assembler::filds(const Address& src) { 20790a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 20800a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 20810a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 20820a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 20830a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 20840a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 2085fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fincstp() { 2086fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2087fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2088fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2089fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2090fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2091fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2092fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ffree(const Immediate& index) { 2093fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(index.value(), 7); 2094fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2095fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xDD); 2096fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC0 + index.value()); 2097fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2098fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2099fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2100fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fsin() { 2101fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2102fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2103fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFE); 2104fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2105fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2106fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2107fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fcos() { 2108fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2109fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2110fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 2111fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2112fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2113fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2114fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::fptan() { 2115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2116fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD9); 2117fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF2); 2118fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2119fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 212024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fucompp() { 212124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 212224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 212324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 212424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 212524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 212624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 212724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86_64Assembler::fprem() { 212824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 212924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 213024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 213124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 213224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 2133fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2134dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xchgl(CpuRegister dst, CpuRegister src) { 2135fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2136851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // There is a short version for rax. 2137851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2138851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // work. 2139851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool src_rax = src.AsRegister() == RAX; 2140851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool dst_rax = dst.AsRegister() == RAX; 2141851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax || dst_rax) { 2142851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src_rax ? dst : src); 2143851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2144851df20225593b10e698a760ac3cd5243620700bAndreas Gampe return; 2145851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2146851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2147851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // General case. 2148851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(src, dst); 2149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x87); 2150851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2151fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2152fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2153ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2154ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffrayvoid X86_64Assembler::xchgq(CpuRegister dst, CpuRegister src) { 2155ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2156851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // There is a short version for rax. 2157851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2158851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // work. 2159851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool src_rax = src.AsRegister() == RAX; 2160851df20225593b10e698a760ac3cd5243620700bAndreas Gampe const bool dst_rax = dst.AsRegister() == RAX; 2161851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax || dst_rax) { 2162851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // If src == target, emit a nop instead. 2163851df20225593b10e698a760ac3cd5243620700bAndreas Gampe if (src_rax && dst_rax) { 2164851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90); 2165851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2166851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRex64(src_rax ? dst : src); 2167851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2168851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2169851df20225593b10e698a760ac3cd5243620700bAndreas Gampe return; 2170851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2171851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2172851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // General case. 2173851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRex64(src, dst); 2174ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray EmitUint8(0x87); 2175851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2176ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray} 2177ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2178ecb2f9ba57b08ceac4204ddd6a0a88a0524f8741Nicolas Geoffray 2179dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xchgl(CpuRegister reg, const Address& address) { 2180fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2181dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2182fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x87); 2183dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2184fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2185fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2186fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 21873b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkovvoid X86_64Assembler::cmpb(const Address& address, const Immediate& imm) { 21883b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21893b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov CHECK(imm.is_int32()); 21903b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOptionalRex32(address); 21913b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(0x80); 21923b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOperand(7, address); 21933b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(imm.value() & 0xFF); 21943b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov} 21953b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 21963b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 21973c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86_64Assembler::cmpw(const Address& address, const Immediate& imm) { 21983c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21996ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 220046fe0650be6a69f63b54c0967194350c6a145557Nicolas Geoffray EmitOperandSizeOverride(); 22013c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitOptionalRex32(address); 220229a8d8478ee4a3386b715c2a1086b190c57f0aa4Vladimir Marko EmitComplex(7, address, imm, /* is_16_op */ true); 22033c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 22043c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 22053c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 2206dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg, const Immediate& imm) { 2207fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 22086ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 2209dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2210fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(7, Operand(reg), imm); 2211fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2212fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2213fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2214dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg0, CpuRegister reg1) { 2215fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2216dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg0, reg1); 2217fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x3B); 2218dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg0.LowBits(), Operand(reg1)); 2219fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2220fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2221fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2222dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpl(CpuRegister reg, const Address& address) { 2223fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2224dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2225fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x3B); 2226dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2227fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2228fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2229fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2230d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpl(const Address& address, CpuRegister reg) { 2231d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2232d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex32(reg, address); 2233d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x39); 2234d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOperand(reg.LowBits(), address); 2235d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2236d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2237d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2238d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpl(const Address& address, const Immediate& imm) { 2239d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 22406ce017304099d1df97ffa016ce0efce79c67f344Nicolas Geoffray CHECK(imm.is_int32()); 2241d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex32(address); 2242d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitComplex(7, address, imm); 2243d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2244d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2245d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 22465a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::cmpq(CpuRegister reg0, CpuRegister reg1) { 22475a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 22485a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(reg0, reg1); 22495a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x3B); 22505a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitOperand(reg0.LowBits(), Operand(reg1)); 22515a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 22525a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 22535a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 225496f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::cmpq(CpuRegister reg, const Immediate& imm) { 225596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 225696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 225796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitRex64(reg); 225896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitComplex(7, Operand(reg), imm); 225996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 226096f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 226196f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 226296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::cmpq(CpuRegister reg, const Address& address) { 226396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 226440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(reg, address); 226596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x3B); 226696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(reg.LowBits(), address); 226796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 226896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 226996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 2270d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cmpq(const Address& address, const Immediate& imm) { 2271d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 2272d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2273d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(address); 2274d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitComplex(7, address, imm); 2275d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2276d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2277d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2278dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister dst, CpuRegister src) { 2279fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2280dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2281fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x03); 2282dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(dst.LowBits(), src.LowBits()); 2283fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2284fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2285fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2286dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister reg, const Address& address) { 2287fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2288dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2289fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x03); 2290dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2291fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2292fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2293fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2294dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::testl(CpuRegister reg1, CpuRegister reg2) { 2295fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2296dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg1, reg2); 2297fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x85); 2298dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2299fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2300fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2301fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2302cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravlevoid X86_64Assembler::testl(CpuRegister reg, const Address& address) { 2303cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2304cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitOptionalRex32(reg, address); 2305cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitUint8(0x85); 2306cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle EmitOperand(reg.LowBits(), address); 2307cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle} 2308cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle 2309cd6dffedf1bd8e6dfb3fb0c933551f9a90f7de3fCalin Juravle 2310dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::testl(CpuRegister reg, const Immediate& immediate) { 2311fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2312fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // For registers that have a byte variant (RAX, RBX, RCX, and RDX) 2313dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // we only test the byte CpuRegister to keep the encoding short. 2314dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (immediate.is_uint8() && reg.AsRegister() < 4) { 2315fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use zero-extended 8-bit immediate. 2316dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (reg.AsRegister() == RAX) { 2317fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xA8); 2318fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2319fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF6); 2320dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xC0 + reg.AsRegister()); 2321fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2322fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(immediate.value() & 0xFF); 2323dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else if (reg.AsRegister() == RAX) { 2324fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use short form if the destination is RAX. 2325fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xA9); 2326fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 2327fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 2328dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2329fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2330fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(0, Operand(reg)); 2331fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitImmediate(immediate); 2332fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2334fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2335fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2336d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::testq(CpuRegister reg1, CpuRegister reg2) { 2337d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2338d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(reg1, reg2); 2339d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x85); 2340d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2341d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2342d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2343d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2344f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86_64Assembler::testq(CpuRegister reg, const Address& address) { 2345f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23467fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(reg, address); 2347f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 2348f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg.LowBits(), address); 2349f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 2350f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 2351f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 2352953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86_64Assembler::testb(const Address& dst, const Immediate& imm) { 2353953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2354953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOptionalRex32(dst); 2355953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF6); 2356953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(Register::RAX, dst); 2357953437bd51059801d92079295f728d0260efca31Vladimir Marko CHECK(imm.is_int8()); 2358953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(imm.value() & 0xFF); 2359953437bd51059801d92079295f728d0260efca31Vladimir Marko} 2360953437bd51059801d92079295f728d0260efca31Vladimir Marko 2361953437bd51059801d92079295f728d0260efca31Vladimir Marko 2362953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86_64Assembler::testl(const Address& dst, const Immediate& imm) { 2363953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2364953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOptionalRex32(dst); 2365953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF7); 2366953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(0, dst); 2367953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitImmediate(imm); 2368953437bd51059801d92079295f728d0260efca31Vladimir Marko} 2369953437bd51059801d92079295f728d0260efca31Vladimir Marko 2370953437bd51059801d92079295f728d0260efca31Vladimir Marko 2371dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::andl(CpuRegister dst, CpuRegister src) { 2372fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2373dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2374fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x23); 2375dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2376fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2377fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2378fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 23799574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::andl(CpuRegister reg, const Address& address) { 23809574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23819574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 23829574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 23839574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 23849574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 23859574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 23869574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2387dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::andl(CpuRegister dst, const Immediate& imm) { 2388fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2389dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 2390fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(4, Operand(dst), imm); 2391fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2392fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2393fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2394412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffrayvoid X86_64Assembler::andq(CpuRegister reg, const Immediate& imm) { 2395412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2396412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray CHECK(imm.is_int32()); // andq only supports 32b immediate. 2397412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitRex64(reg); 2398412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitComplex(4, Operand(reg), imm); 2399412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray} 2400412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 2401412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 24029574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::andq(CpuRegister dst, CpuRegister src) { 24039574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24049574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitRex64(dst, src); 24059574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 24069574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 24079574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24089574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24099574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 241040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::andq(CpuRegister dst, const Address& src) { 241140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 241240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 241340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x23); 241440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 241540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 241640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 241740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2418dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::orl(CpuRegister dst, CpuRegister src) { 2419fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2420dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2421fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0B); 2422dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2423fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2424fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2425fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 24269574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::orl(CpuRegister reg, const Address& address) { 24279574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24289574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 24299574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 24309574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 24319574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24329574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24339574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2434dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::orl(CpuRegister dst, const Immediate& imm) { 2435fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2436dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst); 2437fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(1, Operand(dst), imm); 2438fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2439fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2440fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 24413f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendellvoid X86_64Assembler::orq(CpuRegister dst, const Immediate& imm) { 24423f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24433f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell CHECK(imm.is_int32()); // orq only supports 32b immediate. 24443f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitRex64(dst); 24453f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitComplex(1, Operand(dst), imm); 24463f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell} 24473f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 24483f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 24499574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::orq(CpuRegister dst, CpuRegister src) { 24509574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24519574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitRex64(dst, src); 24529574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 24539574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 24549574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24559574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24569574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 245740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::orq(CpuRegister dst, const Address& src) { 245840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 245940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 246040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x0B); 246140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 246240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 246340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 246440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2465dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::xorl(CpuRegister dst, CpuRegister src) { 2466fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2467dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2468fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x33); 2469dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2470fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2471fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 24725a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 24739574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::xorl(CpuRegister reg, const Address& address) { 24749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(reg, address); 24769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 24779574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg.LowBits(), address); 24789574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24799574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24809574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24819574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86_64Assembler::xorl(CpuRegister dst, const Immediate& imm) { 24829574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24839574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOptionalRex32(dst); 24849574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 24859574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 24869574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 24879574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 2488412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffrayvoid X86_64Assembler::xorq(CpuRegister dst, CpuRegister src) { 2489412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2490412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitRex64(dst, src); 2491412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitUint8(0x33); 2492412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray EmitOperand(dst.LowBits(), Operand(src)); 2493412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray} 2494412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 2495412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray 24965a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::xorq(CpuRegister dst, const Immediate& imm) { 24975a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24985a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // xorq only supports 32b immediate. 24995a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst); 25005a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitComplex(6, Operand(dst), imm); 25015a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 25025a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 250340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::xorq(CpuRegister dst, const Address& src) { 250440741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 250540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitRex64(dst, src); 250640741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(0x33); 250740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitOperand(dst.LowBits(), src); 250840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 250940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 251040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 2511dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers#if 0 2512dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::rex(bool force, bool w, Register* r, Register* x, Register* b) { 2513fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // REX.WRXB 2514fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // W - 64-bit operand 2515fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // R - MODRM.reg 2516fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // X - SIB.index 2517fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // B - MODRM.rm/SIB.base 2518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = force ? 0x40 : 0; 2519dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 2520fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x48; // REX.W000 2521fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2522dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (r != nullptr && *r >= Register::R8 && *r < Register::kNumberOfCpuRegisters) { 2523fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x44; // REX.0R00 2524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *r = static_cast<Register>(*r - 8); 2525fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2526dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (x != nullptr && *x >= Register::R8 && *x < Register::kNumberOfCpuRegisters) { 2527dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x42; // REX.00X0 2528dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *x = static_cast<Register>(*x - 8); 2529dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2530dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (b != nullptr && *b >= Register::R8 && *b < Register::kNumberOfCpuRegisters) { 2531fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko rex |= 0x41; // REX.000B 2532dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *b = static_cast<Register>(*b - 8); 2533fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2534fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (rex != 0) { 2535fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(rex); 2536fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 2537fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2538fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::rex_reg_mem(bool force, bool w, Register* dst, const Address& mem) { 2540dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // REX.WRXB 2541dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // W - 64-bit operand 2542dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // R - MODRM.reg 2543dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // X - SIB.index 2544dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // B - MODRM.rm/SIB.base 2545dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = mem->rex(); 2546dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (force) { 2547dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x40; // REX.0000 2548dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2549dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 2550dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x48; // REX.W000 2551dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2552dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (dst != nullptr && *dst >= Register::R8 && *dst < Register::kNumberOfCpuRegisters) { 2553dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x44; // REX.0R00 2554dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers *dst = static_cast<Register>(*dst - 8); 2555dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2556dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (rex != 0) { 2557dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(rex); 2558dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 2559dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 2560dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 2561dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid rex_mem_reg(bool force, bool w, Address* mem, Register* src); 2562dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers#endif 2563dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 2564dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(CpuRegister reg, const Immediate& imm) { 2565fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2566dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2567fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, Operand(reg), imm); 2568fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2569fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2570fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2571dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addq(CpuRegister reg, const Immediate& imm) { 2572fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25735a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // addq only supports 32b immediate. 2574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRex64(reg); 2575fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, Operand(reg), imm); 2576fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2577fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2578fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 257996f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::addq(CpuRegister dst, const Address& address) { 258096f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25817fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(dst, address); 258296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x03); 258396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(dst.LowBits(), address); 258496f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 258596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 258696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 25875a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::addq(CpuRegister dst, CpuRegister src) { 25885a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25895a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // 0x01 is addq r/m64 <- r/m64 + r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 25905a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(src, dst); 25915a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x01); 25925a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(src.LowBits(), dst.LowBits()); 25935a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 25945a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 25955a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 2596dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::addl(const Address& address, CpuRegister reg) { 2597fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2598dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2599fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x01); 2600dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2601fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2602fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2603fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2604fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::addl(const Address& address, const Immediate& imm) { 2605fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2606dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2607fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(0, address, imm); 2608fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2609fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2610fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2611ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffrayvoid X86_64Assembler::addw(const Address& address, const Immediate& imm) { 2612ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2613ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()) << imm.value(); 2614ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitUint8(0x66); 2615ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitOptionalRex32(address); 2616ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitComplex(0, address, imm, /* is_16_op */ true); 2617ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray} 2618ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray 2619ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray 2620dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister dst, CpuRegister src) { 2621fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2622dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2623fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2B); 2624dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2625fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2626fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2627fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2628dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister reg, const Immediate& imm) { 2629fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2630dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2631fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitComplex(5, Operand(reg), imm); 2632fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2633fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2634fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 26355a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::subq(CpuRegister reg, const Immediate& imm) { 26365a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 26375a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe CHECK(imm.is_int32()); // subq only supports 32b immediate. 26385a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(reg); 26395a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitComplex(5, Operand(reg), imm); 26405a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 26415a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 26425a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 26435a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::subq(CpuRegister dst, CpuRegister src) { 26445a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 26455a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRex64(dst, src); 26465a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x2B); 26475a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitRegisterOperand(dst.LowBits(), src.LowBits()); 26485a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 26495a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 26505a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 265196f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffrayvoid X86_64Assembler::subq(CpuRegister reg, const Address& address) { 265296f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 26537fd8b59ab9fcd896a95883ce7be781d74e849d60Mark Mendell EmitRex64(reg, address); 265496f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitUint8(0x2B); 265596f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray EmitOperand(reg.LowBits() & 7, address); 265696f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray} 265796f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 265896f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray 2659dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::subl(CpuRegister reg, const Address& address) { 2660fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2661dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2662fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x2B); 2663dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2664fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2665fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2666fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2667fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::cdq() { 2668fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2669fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x99); 2670fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2671fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2672fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2673d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::cqo() { 2674d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2675d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(); 2676d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0x99); 2677d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2678d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2679d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2680dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::idivl(CpuRegister reg) { 2681fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2682dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2683fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2684dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xF8 | reg.LowBits()); 2685fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2686fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2687fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2688d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::idivq(CpuRegister reg) { 2689d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2690d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitRex64(reg); 2691d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0xF7); 2692d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(0xF8 | reg.LowBits()); 2693d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 2694d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2695d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 2696dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister dst, CpuRegister src) { 2697fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2698dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(dst, src); 2699fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2700fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAF); 2701dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(dst.LowBits(), Operand(src)); 2702fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2703fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27044a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86_64Assembler::imull(CpuRegister dst, CpuRegister src, const Immediate& imm) { 2705fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2706851df20225593b10e698a760ac3cd5243620700bAndreas Gampe CHECK(imm.is_int32()); // imull only supports 32b immediate. 2707851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 27084a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOptionalRex32(dst, src); 2709851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2710851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // See whether imm can be represented as a sign-extended 8bit value. 2711851df20225593b10e698a760ac3cd5243620700bAndreas Gampe int32_t v32 = static_cast<int32_t>(imm.value()); 2712ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(v32)) { 2713851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Sign-extension works. 2714851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x6B); 27154a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst.LowBits(), Operand(src)); 2716851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 2717851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2718851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Not representable, use full immediate. 2719851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x69); 27204a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst.LowBits(), Operand(src)); 2721851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitImmediate(imm); 2722851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 2723fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2724fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2725fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27264a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86_64Assembler::imull(CpuRegister reg, const Immediate& imm) { 27274a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 27284a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 27294a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 27304a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 2731dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister reg, const Address& address) { 2732fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2733dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg, address); 2734fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 2735fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAF); 2736dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 2737fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2738fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2739fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 274034bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister dst, CpuRegister src) { 274134bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 274234bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRex64(dst, src); 274334bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0x0F); 274434bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0xAF); 274534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRegisterOperand(dst.LowBits(), src.LowBits()); 274634bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 274734bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 274834bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 274934bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister reg, const Immediate& imm) { 27503f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell imulq(reg, reg, imm); 27513f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell} 27523f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell 27533f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendellvoid X86_64Assembler::imulq(CpuRegister dst, CpuRegister reg, const Immediate& imm) { 275434bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 275534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle CHECK(imm.is_int32()); // imulq only supports 32b immediate. 2756851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 27573f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitRex64(dst, reg); 2758851df20225593b10e698a760ac3cd5243620700bAndreas Gampe 2759851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // See whether imm can be represented as a sign-extended 8bit value. 2760851df20225593b10e698a760ac3cd5243620700bAndreas Gampe int64_t v64 = imm.value(); 2761ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(v64)) { 2762851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Sign-extension works. 2763851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x6B); 27643f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitOperand(dst.LowBits(), Operand(reg)); 2765851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(static_cast<uint8_t>(v64 & 0xFF)); 2766851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 2767851df20225593b10e698a760ac3cd5243620700bAndreas Gampe // Not representable, use full immediate. 2768851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitUint8(0x69); 27693f6c7f61855172d3d9b7a9221baba76136088e7cMark Mendell EmitOperand(dst.LowBits(), Operand(reg)); 2770851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitImmediate(imm); 2771851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } 277234bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 277334bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 277434bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravlevoid X86_64Assembler::imulq(CpuRegister reg, const Address& address) { 277534bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 277634bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitRex64(reg, address); 277734bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0x0F); 277834bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitUint8(0xAF); 277934bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle EmitOperand(reg.LowBits(), address); 278034bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle} 278134bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 278234bacdf7eb46c0ffbf24ba7aa14a904bc9176fb2Calin Juravle 2783dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::imull(CpuRegister reg) { 2784fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2785dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2786fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2787fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, Operand(reg)); 2788fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2789fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2790fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 27910f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchezvoid X86_64Assembler::imulq(CpuRegister reg) { 27920f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez AssemblerBuffer::EnsureCapacity ensured(&buffer_); 27930f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitRex64(reg); 27940f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitUint8(0xF7); 27950f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez EmitOperand(5, Operand(reg)); 27960f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez} 27970f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez 27980f88e87085b7cf6544dadff3f555773966a6853eGuillaume Sanchez 2799fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::imull(const Address& address) { 2800fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2801dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2802fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2803fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(5, address); 2804fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2805fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2806fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2807dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::mull(CpuRegister reg) { 2808fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2809dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2810fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2811fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, Operand(reg)); 2812fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2813fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2814fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2815fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mull(const Address& address) { 2816fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2817dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 2818fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2819fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, address); 2820fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2821fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2822fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2823dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shll(CpuRegister reg, const Immediate& imm) { 28241a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 4, reg, imm); 2825fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2826fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2827fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 28289aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shlq(CpuRegister reg, const Immediate& imm) { 28299aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 4, reg, imm); 28309aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 28319aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28329aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 2833dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shll(CpuRegister operand, CpuRegister shifter) { 28349aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 4, operand, shifter); 28359aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 28369aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28379aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28389aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shlq(CpuRegister operand, CpuRegister shifter) { 28399aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 4, operand, shifter); 2840fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2841fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2842fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2843dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shrl(CpuRegister reg, const Immediate& imm) { 28441a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 5, reg, imm); 28451a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray} 28461a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray 28471a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray 28481a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffrayvoid X86_64Assembler::shrq(CpuRegister reg, const Immediate& imm) { 28491a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(true, 5, reg, imm); 2850fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2851fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2852fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2853dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::shrl(CpuRegister operand, CpuRegister shifter) { 28549aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 5, operand, shifter); 28559aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 28569aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28579aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28589aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::shrq(CpuRegister operand, CpuRegister shifter) { 28599aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 5, operand, shifter); 2860fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2861fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2862fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2863dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::sarl(CpuRegister reg, const Immediate& imm) { 28641a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitGenericShift(false, 7, reg, imm); 2865fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2866fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2867fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2868dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::sarl(CpuRegister operand, CpuRegister shifter) { 28699aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(false, 7, operand, shifter); 28709aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 28719aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28729aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28739aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::sarq(CpuRegister reg, const Immediate& imm) { 28749aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 7, reg, imm); 28759aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 28769aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28779aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 28789aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::sarq(CpuRegister operand, CpuRegister shifter) { 28799aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitGenericShift(true, 7, operand, shifter); 2880fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2881fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2882fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2883bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::roll(CpuRegister reg, const Immediate& imm) { 2884bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 0, reg, imm); 2885bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2886bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2887bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2888bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::roll(CpuRegister operand, CpuRegister shifter) { 2889bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 0, operand, shifter); 2890bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2891bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2892bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2893bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorl(CpuRegister reg, const Immediate& imm) { 2894bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 1, reg, imm); 2895bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2896bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2897bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2898bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorl(CpuRegister operand, CpuRegister shifter) { 2899bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(false, 1, operand, shifter); 2900bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2901bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2902bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2903bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rolq(CpuRegister reg, const Immediate& imm) { 2904bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 0, reg, imm); 2905bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2906bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2907bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2908bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rolq(CpuRegister operand, CpuRegister shifter) { 2909bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 0, operand, shifter); 2910bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2911bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2912bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2913bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorq(CpuRegister reg, const Immediate& imm) { 2914bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 1, reg, imm); 2915bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2916bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2917bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2918bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::rorq(CpuRegister operand, CpuRegister shifter) { 2919bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(true, 1, operand, shifter); 2920bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 2921bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2922bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 2923dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::negl(CpuRegister reg) { 2924fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2925dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2926fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2927fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(3, Operand(reg)); 2928fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2929fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2930705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 29312e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillainvoid X86_64Assembler::negq(CpuRegister reg) { 29322e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 29332e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitRex64(reg); 29342e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitUint8(0xF7); 29352e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain EmitOperand(3, Operand(reg)); 29362e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain} 29372e07b4f0a84a7968b4690c2b1be2e2f75cc6fa8eRoland Levillain 2938fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2939dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::notl(CpuRegister reg) { 2940fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2941dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 2942fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF7); 2943dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(0xD0 | reg.LowBits()); 2944fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2945fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2946fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2947705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillainvoid X86_64Assembler::notq(CpuRegister reg) { 2948705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2949705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitRex64(reg); 2950705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitUint8(0xF7); 2951705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain EmitOperand(2, Operand(reg)); 2952705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain} 2953705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 2954705664321a5cc1418255172f92d7d7195cf60a7bRoland Levillain 2955fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::enter(const Immediate& imm) { 2956fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2957fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC8); 2958ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe CHECK(imm.is_uint16()) << imm.value(); 2959fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 2960fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((imm.value() >> 8) & 0xFF); 2961fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x00); 2962fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2963fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2964fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2965fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::leave() { 2966fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2967fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC9); 2968fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2969fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2970fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2971fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ret() { 2972fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2973fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC3); 2974fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2975fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2976fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2977fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::ret(const Immediate& imm) { 2978fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2979fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC2); 2980fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_uint16()); 2981fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 2982fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((imm.value() >> 8) & 0xFF); 2983fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2984fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2985fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2986fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2987fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::nop() { 2988fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2989fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x90); 2990fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2991fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2992fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2993fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::int3() { 2994fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2995fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xCC); 2996fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 2997fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2998fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 2999fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::hlt() { 3000fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3001fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF4); 3002fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3003fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3004fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3005fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::j(Condition condition, Label* label) { 3006fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3007fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 3008fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kShortSize = 2; 3009fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kLongSize = 6; 3010fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 3011fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 3012ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 3013fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x70 + condition); 3014fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((offset - kShortSize) & 0xFF); 3015fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3016fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3017fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x80 + condition); 3018fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - kLongSize); 3019fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3020fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3021fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3022fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x80 + condition); 3023fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 3024fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3025fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3026fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3027fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 302873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::j(Condition condition, NearLabel* label) { 302973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 303073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 303173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 303273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 303373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 303473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 303573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 303673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 303773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 303873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 303973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 304073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 304173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 304273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 304373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 304473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::jrcxz(NearLabel* label) { 304573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 304673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 304773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 304873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 304973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 305073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 305173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 305273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 305373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 305473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 305573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 305673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 305773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 305873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 305973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 3060dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::jmp(CpuRegister reg) { 3061fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3062dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(reg); 3063fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 3064dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitRegisterOperand(4, reg.LowBits()); 3065fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3066fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3067fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::jmp(const Address& address) { 3068fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3069dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex32(address); 3070fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xFF); 3071fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(4, address); 3072fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3073fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3074fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::jmp(Label* label) { 3075fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3076fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 3077fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kShortSize = 2; 3078fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko static const int kLongSize = 5; 3079fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 3080fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 3081ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 3082fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xEB); 3083fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8((offset - kShortSize) & 0xFF); 3084fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3085fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE9); 3086fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - kLongSize); 3087fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3088fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3089fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xE9); 3090fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 3091fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3092fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3093fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3094fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 309573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::jmp(NearLabel* label) { 309673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 309773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 309873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 309973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 310073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 310173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 310273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 310373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 310473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 310573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 310673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 310773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 310873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 310973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 311073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 3111b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86_64Assembler::rep_movsw() { 3112b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3113b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 3114b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 3115b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 3116b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 3117b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 3118b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 3119fca82208f7128fcda09b6a4743199308332558a2Dmitry PetrochenkoX86_64Assembler* X86_64Assembler::lock() { 3120fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3121fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF0); 3122fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return this; 3123fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3124fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3125fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3126dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::cmpxchgl(const Address& address, CpuRegister reg) { 3127fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 312858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOptionalRex32(reg, address); 312958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 313058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xB1); 313158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(reg.LowBits(), address); 313258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 313358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 313458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 313558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86_64Assembler::cmpxchgq(const Address& address, CpuRegister reg) { 313658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 313758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitRex64(reg, address); 3138fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3139fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xB1); 3140dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOperand(reg.LowBits(), address); 3141fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3142fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 314358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 3144fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::mfence() { 3145fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3146fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x0F); 3147fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xAE); 3148fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xF0); 3149fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3150fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 31515a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 3152fca82208f7128fcda09b6a4743199308332558a2Dmitry PetrochenkoX86_64Assembler* X86_64Assembler::gs() { 31535a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // TODO: gs is a prefix and not an instruction 3154fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3155fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x65); 3156fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko return this; 3157fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3158fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 31595a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 3160dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::AddImmediate(CpuRegister reg, const Immediate& imm) { 3161fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int value = imm.value(); 3162dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (value != 0) { 3163dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (value > 0) { 3164fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko addl(reg, imm); 3165dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else { 3166fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko subl(reg, Immediate(value)); 3167fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3168fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3169fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3170fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3171fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 31725a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampevoid X86_64Assembler::setcc(Condition condition, CpuRegister dst) { 31735a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 31745a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe // RSP, RBP, RDI, RSI need rex prefix (else the pattern encodes ah/bh/ch/dh). 31755a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe if (dst.NeedsRex() || dst.AsRegister() > 3) { 31765a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitOptionalRex(true, false, false, false, dst.NeedsRex()); 31775a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 31785a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x0F); 31795a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0x90 + condition); 31805a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitUint8(0xC0 + dst.LowBits()); 31815a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe} 31825a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 318371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::bswapl(CpuRegister dst) { 318471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 318571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, false, false, false, dst.NeedsRex()); 318671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 318771fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0xC8 + dst.LowBits()); 318871fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 318971fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 319071fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampevoid X86_64Assembler::bswapq(CpuRegister dst) { 319171fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 319271fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitOptionalRex(false, true, false, false, dst.NeedsRex()); 319371fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0x0F); 319471fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe EmitUint8(0xC8 + dst.LowBits()); 319571fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe} 319671fb52fee246b7d511f520febbd73dc7a9bbca79Andreas Gampe 3197bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfl(CpuRegister dst, CpuRegister src) { 3198bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3199bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOptionalRex32(dst, src); 3200bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3201bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3202bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3203bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3204bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3205bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfl(CpuRegister dst, const Address& src) { 3206bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3207bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOptionalRex32(dst, src); 3208bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3209bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3210bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOperand(dst.LowBits(), src); 3211bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3212bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3213bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfq(CpuRegister dst, CpuRegister src) { 3214bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3215bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRex64(dst, src); 3216bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3217bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3218bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3219bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3220bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 3221bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86_64Assembler::bsfq(CpuRegister dst, const Address& src) { 3222bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3223bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRex64(dst, src); 3224bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 3225bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 3226bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOperand(dst.LowBits(), src); 3227bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 3228bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 32298ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrl(CpuRegister dst, CpuRegister src) { 32308ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32318ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOptionalRex32(dst, src); 32328ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 32338ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 32348ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 32358ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 32368ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 32378ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrl(CpuRegister dst, const Address& src) { 32388ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32398ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOptionalRex32(dst, src); 32408ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 32418ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 32428ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst.LowBits(), src); 32438ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 32448ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 32458ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrq(CpuRegister dst, CpuRegister src) { 32468ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32478ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRex64(dst, src); 32488ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 32498ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 32508ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst.LowBits(), src.LowBits()); 32518ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 32528ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 32538ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86_64Assembler::bsrq(CpuRegister dst, const Address& src) { 32548ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32558ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRex64(dst, src); 32568ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 32578ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 32588ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst.LowBits(), src); 32598ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 32605a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe 32613f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntl(CpuRegister dst, CpuRegister src) { 32623f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32633f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 32643f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOptionalRex32(dst, src); 32653f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 32663f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 32673f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRegisterOperand(dst.LowBits(), src.LowBits()); 32683f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 32693f67e692860d281858485d48a4f1f81b907f1444Aart Bik 32703f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntl(CpuRegister dst, const Address& src) { 32713f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32723f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 32733f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOptionalRex32(dst, src); 32743f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 32753f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 32763f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOperand(dst.LowBits(), src); 32773f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 32783f67e692860d281858485d48a4f1f81b907f1444Aart Bik 32793f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntq(CpuRegister dst, CpuRegister src) { 32803f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32813f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 32823f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRex64(dst, src); 32833f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 32843f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 32853f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRegisterOperand(dst.LowBits(), src.LowBits()); 32863f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 32873f67e692860d281858485d48a4f1f81b907f1444Aart Bik 32883f67e692860d281858485d48a4f1f81b907f1444Aart Bikvoid X86_64Assembler::popcntq(CpuRegister dst, const Address& src) { 32893f67e692860d281858485d48a4f1f81b907f1444Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 32903f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xF3); 32913f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitRex64(dst, src); 32923f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0x0F); 32933f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitUint8(0xB8); 32943f67e692860d281858485d48a4f1f81b907f1444Aart Bik EmitOperand(dst.LowBits(), src); 32953f67e692860d281858485d48a4f1f81b907f1444Aart Bik} 32963f67e692860d281858485d48a4f1f81b907f1444Aart Bik 3297b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86_64Assembler::repne_scasb() { 3298b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3299b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xF2); 3300b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xAE); 3301b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo} 3302b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 330321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86_64Assembler::repne_scasw() { 330421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 330521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 330621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 330721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 330821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 330921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 331071311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86_64Assembler::repe_cmpsw() { 331171311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331271311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 331371311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 331471311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 331571311f868e2579fa5d40b24e620198734119d1a0agicsaki} 331671311f868e2579fa5d40b24e620198734119d1a0agicsaki 331771311f868e2579fa5d40b24e620198734119d1a0agicsaki 3318970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86_64Assembler::repe_cmpsl() { 3319970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3320970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 3321970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 3322970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 3323970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 3324970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 33253fd0e6a86430bf060c7eb391c1378394c4a2c574agicsakivoid X86_64Assembler::repe_cmpsq() { 33263fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 33273fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitUint8(0xF3); 33283fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitRex64(); 33293fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki EmitUint8(0xA7); 33303fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki} 33313fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki 33323fd0e6a86430bf060c7eb391c1378394c4a2c574agicsaki 3333fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 3334fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // TODO: Need to have a code constants table. 3335fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int64_t constant = bit_cast<int64_t, double>(value); 3336fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko pushq(Immediate(High32Bits(constant))); 3337fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko pushq(Immediate(Low32Bits(constant))); 3338dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers movsd(dst, Address(CpuRegister(RSP), 0)); 333913735955f39b3b304c37d2b2840663c131262c18Ian Rogers addq(CpuRegister(RSP), Immediate(2 * sizeof(intptr_t))); 3340fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3341fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3342fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3343fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::Align(int alignment, int offset) { 3344fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(IsPowerOfTwo(alignment)); 3345fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit nop instruction until the real position is aligned. 3346fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 3347fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko nop(); 3348fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3349fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3350fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3351fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3352fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::Bind(Label* label) { 3353fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int bound = buffer_.Size(); 3354fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(!label->IsBound()); // Labels can only be bound once. 3355fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko while (label->IsLinked()) { 3356fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int position = label->LinkPosition(); 3357fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int next = buffer_.Load<int32_t>(position); 3358fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko buffer_.Store<int32_t>(position, bound - (position + 4)); 3359fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->position_ = next; 3360fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3361fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->BindTo(bound); 3362fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3363fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3364fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 336573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::Bind(NearLabel* label) { 336673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 336773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 336873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 336973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 337073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 337173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 337273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 337373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 337473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 337573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 337673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 337773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 337873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 337973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 3380dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOperand(uint8_t reg_or_opcode, const Operand& operand) { 3381fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GE(reg_or_opcode, 0); 3382fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(reg_or_opcode, 8); 3383fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const int length = operand.length_; 3384fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GT(length, 0); 3385fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit the ModRM byte updated with the given reg value. 3386fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_EQ(operand.encoding_[0] & 0x38, 0); 3387fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 3388fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Emit the rest of the encoded operand. 3389fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko for (int i = 1; i < length; i++) { 3390fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(operand.encoding_[i]); 3391fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3392f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell AssemblerFixup* fixup = operand.GetFixup(); 3393f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (fixup != nullptr) { 3394f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell EmitFixup(fixup); 3395f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3396fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3397fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3398fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3399ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffrayvoid X86_64Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) { 3400ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray if (is_16_op) { 3401ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 3402ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitUint8(imm.value() >> 8); 3403ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray } else if (imm.is_int32()) { 34045a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt32(static_cast<int32_t>(imm.value())); 34055a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } else { 34065a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe EmitInt64(imm.value()); 34075a4fa82ab42af6e728a60e3261963aa243c3e2cdAndreas Gampe } 3408fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3409fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3410fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3411dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitComplex(uint8_t reg_or_opcode, 3412dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers const Operand& operand, 3413ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray const Immediate& immediate, 3414ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray bool is_16_op) { 3415fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_GE(reg_or_opcode, 0); 3416fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LT(reg_or_opcode, 8); 3417fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (immediate.is_int8()) { 3418fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use sign-extended 8-bit immediate. 3419fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x83); 3420fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, operand); 3421fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(immediate.value() & 0xFF); 3422dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } else if (operand.IsRegister(CpuRegister(RAX))) { 3423fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko // Use short form if the destination is eax. 3424fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x05 + (reg_or_opcode << 3)); 3425ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitImmediate(immediate, is_16_op); 3426fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3427fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0x81); 3428fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, operand); 3429ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray EmitImmediate(immediate, is_16_op); 3430fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3431fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3432fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3433fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3434fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::EmitLabel(Label* label, int instruction_size) { 3435fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (label->IsBound()) { 3436fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int offset = label->Position() - buffer_.Size(); 3437fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK_LE(offset, 0); 3438fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(offset - instruction_size); 3439fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3440fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitLabelLink(label); 3441fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3442fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3443fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3444fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3445fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkovoid X86_64Assembler::EmitLabelLink(Label* label) { 3446fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(!label->IsBound()); 3447fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko int position = buffer_.Size(); 3448fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitInt32(label->position_); 3449fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko label->LinkTo(position); 3450fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3451fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3452fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 345373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86_64Assembler::EmitLabelLink(NearLabel* label) { 345473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 345573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 345673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 345773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 345873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 345973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 346073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 346173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 346273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 346373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 346473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 346573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 346673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 346773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 34681a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffrayvoid X86_64Assembler::EmitGenericShift(bool wide, 34691a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray int reg_or_opcode, 34701a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister reg, 34711a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray const Immediate& imm) { 3472fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3473fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko CHECK(imm.is_int8()); 34741a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray if (wide) { 34751a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray EmitRex64(reg); 3476851df20225593b10e698a760ac3cd5243620700bAndreas Gampe } else { 3477851df20225593b10e698a760ac3cd5243620700bAndreas Gampe EmitOptionalRex32(reg); 34781a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray } 3479fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko if (imm.value() == 1) { 3480fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD1); 3481fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(reg)); 3482fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } else { 3483fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xC1); 3484fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(reg)); 3485fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(imm.value() & 0xFF); 3486fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko } 3487fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3488fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3489fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 34909aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86_64Assembler::EmitGenericShift(bool wide, 34919aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle int reg_or_opcode, 34921a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister operand, 34931a43dd78d054dbad8d7af9ba4829ea2f1cb70b53Nicolas Geoffray CpuRegister shifter) { 3494fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3495dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers CHECK_EQ(shifter.AsRegister(), RCX); 34969aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle if (wide) { 34979aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRex64(operand); 34989aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle } else { 34999aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitOptionalRex32(operand); 35009aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle } 3501fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitUint8(0xD3); 3502fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko EmitOperand(reg_or_opcode, Operand(operand)); 3503fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} 3504fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko 3505dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex(bool force, bool w, bool r, bool x, bool b) { 3506dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // REX.WRXB 3507dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // W - 64-bit operand 3508dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // R - MODRM.reg 3509dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // X - SIB.index 3510dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers // B - MODRM.rm/SIB.base 3511dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint8_t rex = force ? 0x40 : 0; 3512dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (w) { 3513dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x48; // REX.W000 3514dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3515dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (r) { 3516dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x44; // REX.0R00 3517dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3518dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (x) { 3519dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x42; // REX.00X0 3520dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3521dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (b) { 3522dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers rex |= 0x41; // REX.000B 3523dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3524dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers if (rex != 0) { 3525dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitUint8(rex); 3526dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers } 3527dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3528dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3529dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister reg) { 3530fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 3531dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3532dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3533dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, CpuRegister src) { 3534dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3535dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3536dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3537dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, XmmRegister src) { 3538dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3539dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3540dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3541dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, XmmRegister src) { 3542dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3543dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3544dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3545dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, CpuRegister src) { 3546dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3547dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3548dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3549dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(const Operand& operand) { 3550790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3551790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3552790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3553790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3554dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3555dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3556dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(CpuRegister dst, const Operand& operand) { 3557790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3558790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3559790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3560790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3561790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3562790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3563790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3564dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3565dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3566dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalRex32(XmmRegister dst, const Operand& operand) { 3567790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = operand.rex(); 3568790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3569790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3570790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3571790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3572790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3573790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3574dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3575dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3576d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::EmitRex64() { 3577d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitOptionalRex(false, true, false, false, false); 3578d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 3579d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 3580dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister reg) { 3581fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov EmitOptionalRex(false, true, false, false, reg.NeedsRex()); 3582dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3583fba52f1b4bf753790c1d98265c4b0fabb54c7536Vladimir Kostyukov 3584d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravlevoid X86_64Assembler::EmitRex64(const Operand& operand) { 3585d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle uint8_t rex = operand.rex(); 3586d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle rex |= 0x48; // REX.W000 3587d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle EmitUint8(rex); 3588d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle} 3589d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 3590dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister dst, CpuRegister src) { 3591dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3592dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3593dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3594102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffrayvoid X86_64Assembler::EmitRex64(XmmRegister dst, CpuRegister src) { 3595102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3596102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray} 3597102cbed1e52b7c5f09458b44903fe97bb3e14d5fNicolas Geoffray 3598624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillainvoid X86_64Assembler::EmitRex64(CpuRegister dst, XmmRegister src) { 3599624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3600624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain} 3601624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain 3602dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitRex64(CpuRegister dst, const Operand& operand) { 3603790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers uint8_t rex = 0x48 | operand.rex(); // REX.W000 3604790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3605790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3606790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 360740741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(rex); 360840741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell} 360940741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell 361040741f394b2737e503f2c08be0ae9dd490fb106bMark Mendellvoid X86_64Assembler::EmitRex64(XmmRegister dst, const Operand& operand) { 361140741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell uint8_t rex = 0x48 | operand.rex(); // REX.W000 361240741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell if (dst.NeedsRex()) { 361340741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell rex |= 0x44; // REX.0R00 3614790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 361540741f394b2737e503f2c08be0ae9dd490fb106bMark Mendell EmitUint8(rex); 3616dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3617dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3618dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, CpuRegister src) { 3619d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // For src, SPL, BPL, SIL, DIL need the rex prefix. 3620d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu bool force = src.AsRegister() > 3; 3621d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu EmitOptionalRex(force, false, dst.NeedsRex(), false, src.NeedsRex()); 3622dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3623dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3624dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, const Operand& operand) { 3625d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu uint8_t rex = operand.rex(); 3626d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu // For dst, SPL, BPL, SIL, DIL need the rex prefix. 3627d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu bool force = dst.AsRegister() > 3; 3628d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu if (force) { 3629d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu rex |= 0x40; // REX.0000 3630d23840d3ed900c6072d71e6599b3568b68de6b7cChao-ying Fu } 3631790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (dst.NeedsRex()) { 3632790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers rex |= 0x44; // REX.0R00 3633790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3634790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers if (rex != 0) { 3635790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers EmitUint8(rex); 3636790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers } 3637dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers} 3638dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers 3639f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendellvoid X86_64Assembler::AddConstantArea() { 364093205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 364139dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 3642f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3643f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell EmitInt32(area[i]); 3644f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3645f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3646f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 36479c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) { 36489c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell size_t result = buffer_.size() * elem_size_; 36499c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell buffer_.push_back(v); 36509c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell return result; 36519c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell} 36529c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell 36539c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) { 36549c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell // Look for an existing match. 365539dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 3656f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (v == buffer_[i]) { 3657f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return i * elem_size_; 3658f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3659f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3660f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3661f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Didn't match anything. 36629c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell return AppendInt32(v); 3663f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3664f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 36659c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) { 3666f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell int32_t v_low = v; 3667f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell int32_t v_high = v >> 32; 3668f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell if (buffer_.size() > 1) { 3669f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Ensure we don't pass the end of the buffer. 367039dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 367139dcf55a56da746e04f477f89e7b00ba1de03880Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 3672f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return i * elem_size_; 3673f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3674f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3675f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell } 3676f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3677f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Didn't match anything. 36789c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendell size_t result = buffer_.size() * elem_size_; 3679f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell buffer_.push_back(v_low); 3680f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell buffer_.push_back(v_high); 3681f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return result; 3682f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3683f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 36849c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddDouble(double v) { 3685f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Treat the value as a 64-bit integer value. 3686f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 3687f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3688f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 36899c86b485bc6169eadf846dd5f7cdf0958fe1eb23Mark Mendellsize_t ConstantArea::AddFloat(float v) { 3690f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell // Treat the value as a 32-bit integer value. 3691f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 3692f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell} 3693f55c3e0825cdfc4c5a27730031177d1a0198ec5aMark Mendell 3694fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} // namespace x86_64 3695fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko} // namespace art 3696