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