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