12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
16a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers#include "assembler_x86.h"
182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers
191aa246dec5abe212f699de1413a0c4a191ca364aElliott Hughes#include "base/casts.h"
20166db04e259ca51838c311891598664deeed85adIan Rogers#include "entrypoints/quick/quick_entrypoints.h"
21578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "memory_region.h"
22578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h"
23a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
246b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art {
252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 {
26a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) {
28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  return os << "XMM" << static_cast<int>(reg);
29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}
30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const X87Register& reg) {
32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  return os << "ST" << static_cast<int>(reg);
33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}
34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
35caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bikstd::ostream& operator<<(std::ostream& os, const Address& addr) {
36caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik  switch (addr.mod()) {
37caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik    case 0:
38f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      if (addr.rm() != ESP || addr.index() == ESP) {
39f7754e861f0dec2d4772d61102fa93252258f672Aart Bik        return os << "(%" << addr.rm() << ")";
40f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      } else if (addr.base() == EBP) {
41f7754e861f0dec2d4772d61102fa93252258f672Aart Bik        return os << static_cast<int>(addr.disp32()) << "(,%" << addr.index()
42f7754e861f0dec2d4772d61102fa93252258f672Aart Bik                  << "," << (1 << addr.scale()) << ")";
43caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik      }
44f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      return os << "(%" << addr.base() << ",%" << addr.index() << "," << (1 << addr.scale()) << ")";
45caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik    case 1:
46f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      if (addr.rm() != ESP || addr.index() == ESP) {
47f7754e861f0dec2d4772d61102fa93252258f672Aart Bik        return os << static_cast<int>(addr.disp8()) << "(%" << addr.rm() << ")";
48caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik      }
49f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      return os << static_cast<int>(addr.disp8()) << "(%" << addr.base() << ",%"
50f7754e861f0dec2d4772d61102fa93252258f672Aart Bik                << addr.index() << "," << (1 << addr.scale()) << ")";
51caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik    case 2:
52f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      if (addr.rm() != ESP || addr.index() == ESP) {
53f7754e861f0dec2d4772d61102fa93252258f672Aart Bik        return os << static_cast<int>(addr.disp32()) << "(%" << addr.rm() << ")";
54caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik      }
55f7754e861f0dec2d4772d61102fa93252258f672Aart Bik      return os << static_cast<int>(addr.disp32()) << "(%" << addr.base() << ",%"
56f7754e861f0dec2d4772d61102fa93252258f672Aart Bik                << addr.index() << "," << (1 << addr.scale()) << ")";
57caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik    default:
58caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik      return os << "<address?>";
59caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik  }
60caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik}
61caa31e732bc9bb0007c39c504b109a4867ee5dd9Aart Bik
622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Register reg) {
63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
64a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(2, reg);
66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(const Address& address) {
70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(2, address);
73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Label* label) {
77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xE8);
79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  static const int kSize = 5;
801cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray  // Offset by one because we already have emitted the opcode.
811cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray  EmitLabel(label, kSize - 1);
82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
858ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffrayvoid X86Assembler::call(const ExternalLabel& label) {
868ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
878ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  intptr_t call_start = buffer_.GetPosition();
888ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  EmitUint8(0xE8);
898ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  EmitInt32(label.address());
908ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  static const intptr_t kCallExternalLabelSize = 5;
918ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize);
928ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray}
938ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray
948ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray
952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(Register reg) {
96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x50 + reg);
98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Address& address) {
102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(6, address);
105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Immediate& imm) {
109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
11044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  if (imm.is_int8()) {
11144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitUint8(0x6A);
11244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitUint8(imm.value() & 0xFF);
11344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  } else {
11444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitUint8(0x68);
11544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitImmediate(imm);
11644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  }
117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(Register reg) {
121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x58 + reg);
123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(const Address& address) {
127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x8F);
129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(0, address);
130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Immediate& imm) {
134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB8 + dst);
136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitImmediate(imm);
137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, Register src) {
141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x89);
143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(src, dst);
144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Address& src) {
148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x8B);
150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, Register src) {
155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x89);
157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, dst);
158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, const Immediate& imm) {
162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC7);
164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(0, dst);
165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitImmediate(imm);
166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
168bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::movl(const Address& dst, Label* lbl) {
169bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
170bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  EmitUint8(0xC7);
171bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  EmitOperand(0, dst);
172bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers  EmitLabel(lbl, dst.length_ + 5);
173bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers}
174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1757a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86Assembler::movntl(const Address& dst, Register src) {
1767a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1777a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell  EmitUint8(0x0F);
1787a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell  EmitUint8(0xC3);
1797a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell  EmitOperand(src, dst);
1807a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell}
1817a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell
18209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::bswapl(Register dst) {
18309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
18409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
18509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0xC8 + dst);
18609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
18709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
188bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::bsfl(Register dst, Register src) {
189bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
190bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitUint8(0x0F);
191bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitUint8(0xBC);
192bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitRegisterOperand(dst, src);
193bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
194bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
195bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::bsfl(Register dst, const Address& src) {
196bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
197bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitUint8(0x0F);
198bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitUint8(0xBC);
199bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitOperand(dst, src);
200bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
201bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2028ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, Register src) {
2038ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2048ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitUint8(0x0F);
2058ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitUint8(0xBD);
2068ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitRegisterOperand(dst, src);
2078ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell}
2088ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
2098ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, const Address& src) {
2108ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2118ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitUint8(0x0F);
2128ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitUint8(0xBD);
2138ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell  EmitOperand(dst, src);
2148ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell}
2158ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell
216c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bikvoid X86Assembler::popcntl(Register dst, Register src) {
217c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
218c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0xF3);
219c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0x0F);
220c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0xB8);
221c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitRegisterOperand(dst, src);
222c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik}
223c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
224c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bikvoid X86Assembler::popcntl(Register dst, const Address& src) {
225c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
226c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0xF3);
227c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0x0F);
228c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitUint8(0xB8);
229c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik  EmitOperand(dst, src);
230c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik}
231c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik
2322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) {
233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB6);
236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) {
241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB6);
244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) {
249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xBE);
252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) {
257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xBE);
260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2641bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) {
265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  LOG(FATAL) << "Use movzxb or movsxb instead.";
266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) {
270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x88);
272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, dst);
273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) {
277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC6);
279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(EAX, dst);
280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(imm.is_int8());
281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(imm.value() & 0xFF);
282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) {
286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB7);
289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) {
294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB7);
297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) {
302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xBF);
305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) {
310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xBF);
313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3171bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) {
318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  LOG(FATAL) << "Use movzxw or movsxw instead.";
319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) {
323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperandSizeOverride();
325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x89);
326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, dst);
327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
33026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86Assembler::movw(const Address& dst, const Immediate& imm) {
33126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
33226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  EmitOperandSizeOverride();
33326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  EmitUint8(0xC7);
33426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  EmitOperand(0, dst);
335b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray  CHECK(imm.is_uint16() || imm.is_int16());
33626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  EmitUint8(imm.value() & 0xFF);
33726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray  EmitUint8(imm.value() >> 8);
33826a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray}
33926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray
34026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray
3412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) {
342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x8D);
344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
3482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) {
349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
351b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EmitUint8(0x40 + condition);
352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
356abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendellvoid X86Assembler::cmovl(Condition condition, Register dst, const Address& src) {
357abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
358abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell  EmitUint8(0x0F);
359abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell  EmitUint8(0x40 + condition);
360abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell  EmitOperand(dst, src);
361abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell}
362abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell
363abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell
3645b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffrayvoid X86Assembler::setb(Condition condition, Register dst) {
365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
367b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EmitUint8(0x90 + condition);
3685b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray  EmitOperand(0, Operand(dst));
3697fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray}
3707fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray
3717fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray
3727fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86Assembler::movaps(XmmRegister dst, XmmRegister src) {
3737fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
3747fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray  EmitUint8(0x0F);
3757fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray  EmitUint8(0x28);
3767fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray  EmitXmmRegisterOperand(dst, src);
377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
380c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movaps(XmmRegister dst, const Address& src) {
381c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
382c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
383c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x28);
384c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(dst, src);
385c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
386c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
387c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
388c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movups(XmmRegister dst, const Address& src) {
389c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
390c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
391c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x10);
392c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(dst, src);
393c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
394c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
395c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
396c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movaps(const Address& dst, XmmRegister src) {
397c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
398c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
399c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x29);
400c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(src, dst);
401c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
402c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
403c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
404c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movups(const Address& dst, XmmRegister src) {
405c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
406c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
407c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x11);
408c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(src, dst);
409c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
410c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
411c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
4122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) {
413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x10);
417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) {
422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x11);
426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, dst);
427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) {
431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x11);
435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(src, dst);
436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) {
440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x6E);
444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) {
449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x7E);
453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, Operand(dst));
454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) {
458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x58);
462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) {
467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x58);
471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) {
476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5C);
480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) {
485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5C);
489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
4932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) {
494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x59);
498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
5022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) {
503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x59);
507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
5112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) {
512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5E);
516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
5202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) {
521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5E);
525a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
529c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::addps(XmmRegister dst, XmmRegister src) {
530c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
531c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
532c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x58);
533c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
534c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
535c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
536c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
537c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::subps(XmmRegister dst, XmmRegister src) {
538c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
539c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
540c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x5C);
541c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
542c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
543c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
544c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
545c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::mulps(XmmRegister dst, XmmRegister src) {
546c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
547c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
548c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x59);
549c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
550c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
551c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
552c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
553c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::divps(XmmRegister dst, XmmRegister src) {
554c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
555c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
556c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x5E);
557c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
558c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
559c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
560c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
561c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(XmmRegister dst, XmmRegister src) {
562c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
563c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
564c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
565c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x28);
566c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
567c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
568c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
569c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
570c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(XmmRegister dst, const Address& src) {
571c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
572c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
573c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
574c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x28);
575c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(dst, src);
576c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
577c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
578c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
579c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movupd(XmmRegister dst, const Address& src) {
580c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
581c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
582c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
583c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x10);
584c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(dst, src);
585c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
586c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
587c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
588c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(const Address& dst, XmmRegister src) {
589c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
590c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
591c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
592c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x29);
593c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(src, dst);
594c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
595c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
596c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
597c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movupd(const Address& dst, XmmRegister src) {
598c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
599c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
600c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
601c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x11);
602c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitOperand(src, dst);
603c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
604c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
605c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
6062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) {
607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(0, src);
610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
61324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) {
61424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
61524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xD9);
61624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitOperand(2, dst);
61724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell}
61824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
61924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
6202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) {
621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(3, dst);
624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) {
628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x10);
632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) {
637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x11);
641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(src, dst);
642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) {
646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x11);
650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(src, dst);
651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
654234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) {
655234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
656234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x66);
657234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x0F);
658234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x16);
659234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitOperand(dst, src);
660234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray}
661234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
662234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
663234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) {
664234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
665234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x66);
666234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x0F);
667234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitUint8(0x17);
668234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray  EmitOperand(src, dst);
669234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray}
670234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
671234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray
6722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) {
673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x58);
677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) {
682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x58);
686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) {
691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5C);
695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
6992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) {
700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5C);
704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
7082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) {
709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x59);
713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
7172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) {
718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x59);
722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
7262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) {
727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
728a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5E);
731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
7352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) {
736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
738a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5E);
740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
744c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::addpd(XmmRegister dst, XmmRegister src) {
745c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
746c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
747c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
748c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x58);
749c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
750c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
751c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
752c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
753c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::subpd(XmmRegister dst, XmmRegister src) {
754c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
755c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
756c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
757c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x5C);
758c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
759c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
760c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
761c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
762c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::mulpd(XmmRegister dst, XmmRegister src) {
763c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
764c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
765c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
766c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x59);
767c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
768c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
769c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
770c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
771c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::divpd(XmmRegister dst, XmmRegister src) {
772c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
773c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x66);
774c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x0F);
775c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitUint8(0x5E);
776c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik  EmitXmmRegisterOperand(dst, src);
777c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik}
778c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
779c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik
78068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(XmmRegister dst, XmmRegister src) {
78168555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
78268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
78368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
78468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x6F);
78568555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
78668555e952eea58023fa403951b1491496acf0f4bAart Bik}
78768555e952eea58023fa403951b1491496acf0f4bAart Bik
78868555e952eea58023fa403951b1491496acf0f4bAart Bik
78968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(XmmRegister dst, const Address& src) {
79068555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
79168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
79268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
79368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x6F);
79468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(dst, src);
79568555e952eea58023fa403951b1491496acf0f4bAart Bik}
79668555e952eea58023fa403951b1491496acf0f4bAart Bik
79768555e952eea58023fa403951b1491496acf0f4bAart Bik
79868555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqu(XmmRegister dst, const Address& src) {
79968555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
80068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xF3);
80168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
80268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x6F);
80368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(dst, src);
80468555e952eea58023fa403951b1491496acf0f4bAart Bik}
80568555e952eea58023fa403951b1491496acf0f4bAart Bik
80668555e952eea58023fa403951b1491496acf0f4bAart Bik
80768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(const Address& dst, XmmRegister src) {
80868555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
80968555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
81068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
81168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x7F);
81268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(src, dst);
81368555e952eea58023fa403951b1491496acf0f4bAart Bik}
81468555e952eea58023fa403951b1491496acf0f4bAart Bik
81568555e952eea58023fa403951b1491496acf0f4bAart Bik
81668555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqu(const Address& dst, XmmRegister src) {
81768555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
81868555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xF3);
81968555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
82068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x7F);
82168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(src, dst);
82268555e952eea58023fa403951b1491496acf0f4bAart Bik}
82368555e952eea58023fa403951b1491496acf0f4bAart Bik
82468555e952eea58023fa403951b1491496acf0f4bAart Bik
825e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddb(XmmRegister dst, XmmRegister src) {
826e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
827e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
828e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
829e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xFC);
830e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
831e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
832e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
833e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
834e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubb(XmmRegister dst, XmmRegister src) {
835e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
836e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
837e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
838e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xF8);
839e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
840e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
841e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
842e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
843e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddw(XmmRegister dst, XmmRegister src) {
844e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
845e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
846e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
847e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xFD);
848e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
849e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
850e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
851e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
852e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubw(XmmRegister dst, XmmRegister src) {
853e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
854e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
855e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
856e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xF9);
857e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
858e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
859e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
860e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
861e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::pmullw(XmmRegister dst, XmmRegister src) {
862e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
863e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
864e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
865e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xD5);
866e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
867e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
868e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
869e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
87068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::paddd(XmmRegister dst, XmmRegister src) {
87168555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
87268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
87368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
87468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xFE);
87568555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
87668555e952eea58023fa403951b1491496acf0f4bAart Bik}
87768555e952eea58023fa403951b1491496acf0f4bAart Bik
87868555e952eea58023fa403951b1491496acf0f4bAart Bik
87968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::psubd(XmmRegister dst, XmmRegister src) {
88068555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
88168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
88268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
88368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xFA);
88468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
88568555e952eea58023fa403951b1491496acf0f4bAart Bik}
88668555e952eea58023fa403951b1491496acf0f4bAart Bik
88768555e952eea58023fa403951b1491496acf0f4bAart Bik
88868555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pmulld(XmmRegister dst, XmmRegister src) {
88968555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
89068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
89168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
89268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x38);
89368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x40);
89468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
89568555e952eea58023fa403951b1491496acf0f4bAart Bik}
89668555e952eea58023fa403951b1491496acf0f4bAart Bik
89768555e952eea58023fa403951b1491496acf0f4bAart Bik
898e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddq(XmmRegister dst, XmmRegister src) {
899e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
900e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
901e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
902e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xD4);
903e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
904e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
905e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
906e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
907e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubq(XmmRegister dst, XmmRegister src) {
908e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
909e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
910e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
911e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0xFB);
912e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
913e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
914e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
915e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
9162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) {
917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2A);
921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) {
926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
927a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2A);
930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) {
935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2D);
939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) {
944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5A);
948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) {
953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2D);
957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) {
962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
964a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2C);
966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) {
971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2C);
975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
978a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) {
980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x5A);
984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
9883ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bikvoid X86Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) {
9893ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
9903ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik  EmitUint8(0x0F);
9913ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik  EmitUint8(0x5B);
9923ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik  EmitXmmRegisterOperand(dst, src);
9933ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik}
9943ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik
9953ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik
9962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) {
997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xE6);
1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
10052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) {
1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2F);
1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(a, b);
1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1012a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
101318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comiss(XmmRegister a, const Address& b) {
101418ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
101518ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitUint8(0x0F);
101618ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitUint8(0x2F);
101718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitOperand(a, b);
101818ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik}
101918ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik
102018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik
10212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) {
1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2F);
1026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(a, b);
1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
103018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comisd(XmmRegister a, const Address& b) {
103118ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
103218ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitUint8(0x66);
103318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitUint8(0x0F);
103418ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitUint8(0x2F);
103518ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik  EmitOperand(a, b);
103618ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik}
103718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik
103818ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik
1039ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) {
1040ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1041ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitUint8(0x0F);
1042ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitUint8(0x2E);
1043ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitXmmRegisterOperand(a, b);
1044ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle}
1045ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle
1046ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle
10479f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomiss(XmmRegister a, const Address& b) {
10489f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
10499f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitUint8(0x0F);
10509f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitUint8(0x2E);
10519f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitOperand(a, b);
10529f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell}
10539f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell
10549f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell
1055ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) {
1056ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1057ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitUint8(0x66);
1058ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitUint8(0x0F);
1059ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitUint8(0x2E);
1060ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle  EmitXmmRegisterOperand(a, b);
1061ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle}
1062ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle
1063ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle
10649f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomisd(XmmRegister a, const Address& b) {
10659f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
10669f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitUint8(0x66);
10679f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitUint8(0x0F);
10689f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitUint8(0x2E);
10699f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell  EmitOperand(a, b);
10709f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell}
10719f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell
10729f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell
1073fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1074fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1075fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x66);
1076fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x0F);
1077fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x3A);
1078fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x0B);
1079fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitXmmRegisterOperand(dst, src);
1080fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(imm.value());
1081fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell}
1082fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell
1083fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell
1084fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) {
1085fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1086fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x66);
1087fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x0F);
1088fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x3A);
1089fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(0x0A);
1090fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitXmmRegisterOperand(dst, src);
1091fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell  EmitUint8(imm.value());
1092fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell}
1093fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell
1094fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell
10952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) {
1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x51);
1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
11042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) {
1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF3);
1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x51);
1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
11132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) {
1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x57);
1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
11222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) {
1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
1125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x57);
1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
113168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::xorps(XmmRegister dst, const Address& src) {
113209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
113309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
113468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x57);
113568555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(dst, src);
113668555e952eea58023fa403951b1491496acf0f4bAart Bik}
113768555e952eea58023fa403951b1491496acf0f4bAart Bik
113868555e952eea58023fa403951b1491496acf0f4bAart Bik
113968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) {
114068555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
114168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
114268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x57);
114368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
114468555e952eea58023fa403951b1491496acf0f4bAart Bik}
114568555e952eea58023fa403951b1491496acf0f4bAart Bik
114668555e952eea58023fa403951b1491496acf0f4bAart Bik
114768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pxor(XmmRegister dst, XmmRegister src) {
114868555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
114968555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
115068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
115168555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xEF);
115209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitXmmRegisterOperand(dst, src);
115309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
115409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
115509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
115609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) {
115709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
115809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x66);
115909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
116009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x54);
116109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitXmmRegisterOperand(dst, src);
116209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
116309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
116409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
116568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andpd(XmmRegister dst, const Address& src) {
116609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
116709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x66);
116809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
116968555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x54);
117068555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitOperand(dst, src);
117168555e952eea58023fa403951b1491496acf0f4bAart Bik}
117268555e952eea58023fa403951b1491496acf0f4bAart Bik
117368555e952eea58023fa403951b1491496acf0f4bAart Bik
117468555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) {
117568555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
117668555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
117768555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x54);
117809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitXmmRegisterOperand(dst, src);
117909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
118009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
118109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
118268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andps(XmmRegister dst, const Address& src) {
1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
118568555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x54);
1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, src);
1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
119068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pand(XmmRegister dst, XmmRegister src) {
119109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
119268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
119309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
119468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xDB);
119509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitXmmRegisterOperand(dst, src);
119609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
119709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
119809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
119921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86Assembler::andnpd(XmmRegister dst, XmmRegister src) {
120021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
120121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x66);
120221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x0F);
120321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x55);
120421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitXmmRegisterOperand(dst, src);
120521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik}
120621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
120721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
120821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86Assembler::andnps(XmmRegister dst, XmmRegister src) {
120921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
121021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x0F);
121121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x55);
121221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitXmmRegisterOperand(dst, src);
121321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik}
121421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
121521c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
121621c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bikvoid X86Assembler::pandn(XmmRegister dst, XmmRegister src) {
121721c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
121821c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x66);
121921c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0x0F);
122021c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitUint8(0xDF);
122121c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik  EmitXmmRegisterOperand(dst, src);
122221c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik}
122321c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
122421c580bf3f024f3f02d627013fba18a4b4f855d5Aart Bik
122568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) {
1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
122768555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
1228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
122968555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x56);
1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitXmmRegisterOperand(dst, src);
1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
123468555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) {
123509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
123609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x0F);
123768555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x56);
123868555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
123909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
124009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
124109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
124268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::por(XmmRegister dst, XmmRegister src) {
1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x66);
1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
124668555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0xEB);
124768555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
1248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
125167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86Assembler::pavgb(XmmRegister dst, XmmRegister src) {
125267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
125367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0x66);
125467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0x0F);
125567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0xE0);
125667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitXmmRegisterOperand(dst, src);
125767d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik}
125867d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik
125967d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik
126067d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bikvoid X86Assembler::pavgw(XmmRegister dst, XmmRegister src) {
126167d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
126267d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0x66);
126367d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0x0F);
126467d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitUint8(0xE3);
126567d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik  EmitXmmRegisterOperand(dst, src);
126667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik}
126767d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik
12686005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12696005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::psadbw(XmmRegister dst, XmmRegister src) {
12706005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
12716005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
12726005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
12736005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0xF6);
12746005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
12756005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
12766005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12776005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12786005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::pmaddwd(XmmRegister dst, XmmRegister src) {
12796005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
12806005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
12816005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
12826005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0xF5);
12836005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
12846005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
12856005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12866005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12876005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::phaddw(XmmRegister dst, XmmRegister src) {
12886005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
12896005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
12906005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
12916005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x38);
12926005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x01);
12936005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
12946005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
12956005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12966005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
12976005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::phaddd(XmmRegister dst, XmmRegister src) {
12986005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
12996005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
13006005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13016005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x38);
13026005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x02);
13036005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13046005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13056005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13066005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13076005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::haddps(XmmRegister dst, XmmRegister src) {
13086005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13096005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0xF2);
13106005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13116005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x7C);
13126005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13136005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13146005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13156005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13166005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::haddpd(XmmRegister dst, XmmRegister src) {
13176005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13186005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
13196005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13206005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x7C);
13216005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13226005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13236005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13246005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13256005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::phsubw(XmmRegister dst, XmmRegister src) {
13266005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13276005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
13286005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13296005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x38);
13306005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x05);
13316005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13326005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13336005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13346005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13356005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::phsubd(XmmRegister dst, XmmRegister src) {
13366005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13376005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
13386005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13396005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x38);
13406005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x06);
13416005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13426005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13436005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13446005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13456005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::hsubps(XmmRegister dst, XmmRegister src) {
13466005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13476005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0xF2);
13486005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13496005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x7D);
13506005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13516005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13526005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13536005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13546005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bikvoid X86Assembler::hsubpd(XmmRegister dst, XmmRegister src) {
13556005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
13566005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x66);
13576005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x0F);
13586005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitUint8(0x7D);
13596005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik  EmitXmmRegisterOperand(dst, src);
13606005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik}
13616005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
13626005a87fa5524bd44c36f4dd6adca92e2d4bc9b1Aart Bik
1363c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminsb(XmmRegister dst, XmmRegister src) {
1364c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1365c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1366c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1367c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1368c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1369c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1370c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1371c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1372c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxsb(XmmRegister dst, XmmRegister src) {
1373c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1374c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1375c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1376c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1377c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3C);
1378c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1379c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1380c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1381c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminsw(XmmRegister dst, XmmRegister src) {
1382c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1383c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1384c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1385c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0xEA);
1386c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1387c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1388c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1389c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxsw(XmmRegister dst, XmmRegister src) {
1390c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1391c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1392c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1393c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0xEE);
1394c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1395c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1396c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1397c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminsd(XmmRegister dst, XmmRegister src) {
1398c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1399c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1400c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1401c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1402c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x39);
1403c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1404c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1405c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1406c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxsd(XmmRegister dst, XmmRegister src) {
1407c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1408c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1409c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1410c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1411c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3D);
1412c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1413c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1414c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1415c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminub(XmmRegister dst, XmmRegister src) {
1416c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1417c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1418c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1419c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0xDA);
1420c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1421c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1422c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1423c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxub(XmmRegister dst, XmmRegister src) {
1424c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1425c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1426c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1427c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0xDE);
1428c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1429c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1430c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1431c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminuw(XmmRegister dst, XmmRegister src) {
1432c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1433c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1434c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1435c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1436c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3A);
1437c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1438c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1439c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1440c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxuw(XmmRegister dst, XmmRegister src) {
1441c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1442c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1443c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1444c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1445c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3E);
1446c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1447c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1448c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1449c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pminud(XmmRegister dst, XmmRegister src) {
1450c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1451c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1452c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1453c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1454c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3B);
1455c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1456c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1457c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1458c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::pmaxud(XmmRegister dst, XmmRegister src) {
1459c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1460c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1461c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1462c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x38);
1463c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x3F);
1464c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1465c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1466c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1467c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::minps(XmmRegister dst, XmmRegister src) {
1468c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1469c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1470c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x5D);
1471c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1472c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1473c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1474c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::maxps(XmmRegister dst, XmmRegister src) {
1475c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1476c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1477c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x5F);
1478c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1479c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1480c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1481c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::minpd(XmmRegister dst, XmmRegister src) {
1482c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1483c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1484c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1485c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x5D);
1486c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1487c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
1488c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik
1489c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bikvoid X86Assembler::maxpd(XmmRegister dst, XmmRegister src) {
1490c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1491c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x66);
1492c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x0F);
1493c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitUint8(0x5F);
1494c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik  EmitXmmRegisterOperand(dst, src);
1495c8e93c736c149ce41be073dd24324fb08afb9ae4Aart Bik}
149667d3fd77d1572e46f537dea2fd4ded3ecfd7c202Aart Bik
14974b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
14984b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
14994b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x66);
15004b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x0F);
15014b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x74);
15024b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitXmmRegisterOperand(dst, src);
15034b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik}
15044b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15054b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15064b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
15074b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15084b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x66);
15094b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x0F);
15104b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x75);
15114b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitXmmRegisterOperand(dst, src);
15124b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik}
15134b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15144b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15154b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
15164b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15174b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x66);
15184b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x0F);
15194b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x76);
15204b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitXmmRegisterOperand(dst, src);
15214b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik}
15224b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15234b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15244b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bikvoid X86Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
15254b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15264b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x66);
15274b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x0F);
15284b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x38);
15294b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitUint8(0x29);
15304b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik  EmitXmmRegisterOperand(dst, src);
15314b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik}
15324b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15334b4553340dded4e8ce8f56690c08561a39a4aa56Aart Bik
15348939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) {
15358939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15368939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x66);
15378939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x0F);
15388939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x64);
15398939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitXmmRegisterOperand(dst, src);
15408939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik}
15418939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15428939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15438939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) {
15448939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15458939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x66);
15468939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x0F);
15478939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x65);
15488939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitXmmRegisterOperand(dst, src);
15498939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik}
15508939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15518939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15528939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) {
15538939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15548939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x66);
15558939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x0F);
15568939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x66);
15578939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitXmmRegisterOperand(dst, src);
15588939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik}
15598939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15608939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15618939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bikvoid X86Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) {
15628939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
15638939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x66);
15648939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x0F);
15658939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x38);
15668939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitUint8(0x37);
15678939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik  EmitXmmRegisterOperand(dst, src);
15688939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik}
15698939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
15708939c6474a34eb6d642db8fecb8b3a5c3194e464Aart Bik
157112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
157212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
157312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(0x66);
157412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(0x0F);
157512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(0xC6);
157612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitXmmRegisterOperand(dst, src);
157712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(imm.value());
157812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik}
157912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik
158012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik
158112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) {
158212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
158312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(0x0F);
158412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(0xC6);
158512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitXmmRegisterOperand(dst, src);
158612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik  EmitUint8(imm.value());
158712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik}
158812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik
158912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik
159068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
159168555e952eea58023fa403951b1491496acf0f4bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
159268555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x66);
159368555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x0F);
159468555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(0x70);
159568555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitXmmRegisterOperand(dst, src);
159668555e952eea58023fa403951b1491496acf0f4bAart Bik  EmitUint8(imm.value());
159768555e952eea58023fa403951b1491496acf0f4bAart Bik}
159868555e952eea58023fa403951b1491496acf0f4bAart Bik
159968555e952eea58023fa403951b1491496acf0f4bAart Bik
1600e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklbw(XmmRegister dst, XmmRegister src) {
1601e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1602e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1603e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1604e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x60);
1605e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
1606e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1607e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1608e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1609e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklwd(XmmRegister dst, XmmRegister src) {
1610e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1611e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1612e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1613e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x61);
1614e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
1615e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1616e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1617e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1618e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) {
1619e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1620e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1621e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1622e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x62);
1623e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
1624e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1625e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1626e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1627e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) {
1628e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1629e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1630e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1631e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x6C);
1632e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(dst, src);
1633e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1634e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1635e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
16363332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86Assembler::punpckhbw(XmmRegister dst, XmmRegister src) {
16373332db8345de39eb5067d99987fcae140184672bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
16383332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x66);
16393332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x0F);
16403332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x68);
16413332db8345de39eb5067d99987fcae140184672bAart Bik  EmitXmmRegisterOperand(dst, src);
16423332db8345de39eb5067d99987fcae140184672bAart Bik}
16433332db8345de39eb5067d99987fcae140184672bAart Bik
16443332db8345de39eb5067d99987fcae140184672bAart Bik
16453332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86Assembler::punpckhwd(XmmRegister dst, XmmRegister src) {
16463332db8345de39eb5067d99987fcae140184672bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
16473332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x66);
16483332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x0F);
16493332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x69);
16503332db8345de39eb5067d99987fcae140184672bAart Bik  EmitXmmRegisterOperand(dst, src);
16513332db8345de39eb5067d99987fcae140184672bAart Bik}
16523332db8345de39eb5067d99987fcae140184672bAart Bik
16533332db8345de39eb5067d99987fcae140184672bAart Bik
16543332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86Assembler::punpckhdq(XmmRegister dst, XmmRegister src) {
16553332db8345de39eb5067d99987fcae140184672bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
16563332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x66);
16573332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x0F);
16583332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x6A);
16593332db8345de39eb5067d99987fcae140184672bAart Bik  EmitXmmRegisterOperand(dst, src);
16603332db8345de39eb5067d99987fcae140184672bAart Bik}
16613332db8345de39eb5067d99987fcae140184672bAart Bik
16623332db8345de39eb5067d99987fcae140184672bAart Bik
16633332db8345de39eb5067d99987fcae140184672bAart Bikvoid X86Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) {
16643332db8345de39eb5067d99987fcae140184672bAart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
16653332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x66);
16663332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x0F);
16673332db8345de39eb5067d99987fcae140184672bAart Bik  EmitUint8(0x6D);
16683332db8345de39eb5067d99987fcae140184672bAart Bik  EmitXmmRegisterOperand(dst, src);
16693332db8345de39eb5067d99987fcae140184672bAart Bik}
16703332db8345de39eb5067d99987fcae140184672bAart Bik
16713332db8345de39eb5067d99987fcae140184672bAart Bik
1672e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psllw(XmmRegister reg, const Immediate& shift_count) {
1673e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1674e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1675e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1676e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1677e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x71);
1678e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(6, reg);
1679e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1680e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1681e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1682e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1683e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::pslld(XmmRegister reg, const Immediate& shift_count) {
1684e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1685e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1686e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1687e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1688e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x72);
1689e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(6, reg);
1690e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1691e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1692e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1693e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1694e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psllq(XmmRegister reg, const Immediate& shift_count) {
1695e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1696e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1697e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1698e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1699e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x73);
1700e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(6, reg);
1701e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1702e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1703e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1704e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1705e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psraw(XmmRegister reg, const Immediate& shift_count) {
1706e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1707e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1708e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1709e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1710e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x71);
1711e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(4, reg);
1712e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1713e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1714e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1715e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1716e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrad(XmmRegister reg, const Immediate& shift_count) {
1717e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1718e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1719e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1720e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1721e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x72);
1722e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(4, reg);
1723e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1724e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1725e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1726e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1727e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) {
1728e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1729e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1730e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1731e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1732e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x71);
1733e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(2, reg);
1734e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1735e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1736e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1737e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1738e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrld(XmmRegister reg, const Immediate& shift_count) {
1739e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1740e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1741e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1742e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1743e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x72);
1744e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(2, reg);
1745e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1746e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1747e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1748e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1749e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) {
1750e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1751e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1752e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1753e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1754e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x73);
1755e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(2, reg);
1756e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1757e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1758e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1759e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1760e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) {
1761e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  DCHECK(shift_count.is_uint8());
1762e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1763e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x66);
1764e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x0F);
1765e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(0x73);
1766e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitXmmRegisterOperand(3, reg);
1767e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik  EmitUint8(shift_count.value());
1768e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik}
1769e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
1770e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik
17712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) {
1772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDD);
1774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(0, src);
1775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
177824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) {
177924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
178024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xDD);
178124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitOperand(2, dst);
178224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell}
178324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
178424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
17852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) {
1786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDD);
1788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(3, dst);
1789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
179224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() {
179324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
179424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0x9B);
179524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xDF);
179624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xE0);
179724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell}
179824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
179924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
18002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) {
1801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(7, dst);
1804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) {
1808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(5, src);
1811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) {
1815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDF);
1817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(7, dst);
1818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) {
1822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDB);
1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(3, dst);
1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) {
1829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDF);
1831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(5, src);
1832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18350a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) {
18360a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
18370a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain  EmitUint8(0xDB);
18380a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain  EmitOperand(0, src);
18390a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain}
18400a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain
18410a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain
18422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() {
1843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
1846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1848a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) {
1850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_LT(index.value(), 7);
1851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xDD);
1853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC0 + index.value());
1854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() {
1858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFE);
1861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() {
1865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
1868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() {
1872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD9);
1874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF2);
1875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
187824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() {
187924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
188024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xDA);
188124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xE9);
188224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell}
188324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
188424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
188524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() {
188624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
188724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xD9);
188824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell  EmitUint8(0xF8);
188924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell}
189024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
189124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell
18922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) {
1893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x87);
1895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
1896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
18983c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray
18997caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) {
19007caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
19017caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  EmitUint8(0x87);
19027caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  EmitOperand(reg, address);
19037caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers}
19047caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers
1905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19063b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkovvoid X86Assembler::cmpb(const Address& address, const Immediate& imm) {
19073b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
19083b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov  EmitUint8(0x80);
19093b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov  EmitOperand(7, address);
19103b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov  EmitUint8(imm.value() & 0xFF);
19113b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov}
19123b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov
19133b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov
19143c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) {
19153c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
19163c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray  EmitUint8(0x66);
191729a8d8478ee4a3386b715c2a1086b190c57f0aa4Vladimir Marko  EmitComplex(7, address, imm, /* is_16_op */ true);
19183c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray}
19193c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray
19203c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray
19212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) {
1922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(7, Operand(reg), imm);
1924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1925a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) {
1928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x3B);
1930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg0, Operand(reg1));
1931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) {
1935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x3B);
1937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
1938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) {
1942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1943a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x03);
1944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(dst, src);
1945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) {
1949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x03);
1951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
1952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) {
1956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x39);
1958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
1959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) {
1963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1964a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(7, address, imm);
1965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
19682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) {
1969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x85);
1971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(reg1, reg2);
1972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
1973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
1975f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) {
1976f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1977f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray  EmitUint8(0x85);
1978f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray  EmitOperand(reg, address);
1979f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray}
1980f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray
1981f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray
19822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) {
1983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
1985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  // we only test the byte register to keep the encoding short.
1986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (immediate.is_uint8() && reg < 4) {
1987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    // Use zero-extended 8-bit immediate.
1988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    if (reg == EAX) {
1989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0xA8);
1990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    } else {
1991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0xF6);
1992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0xC0 + reg);
1993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    }
1994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(immediate.value() & 0xFF);
1995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else if (reg == EAX) {
1996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    // Use short form if the destination is EAX.
1997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0xA9);
1998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitImmediate(immediate);
1999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0xF7);
2001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitOperand(0, Operand(reg));
2002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitImmediate(immediate);
2003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2005a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2007953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testb(const Address& dst, const Immediate& imm) {
2008953437bd51059801d92079295f728d0260efca31Vladimir Marko  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2009953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitUint8(0xF6);
2010953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitOperand(EAX, dst);
2011953437bd51059801d92079295f728d0260efca31Vladimir Marko  CHECK(imm.is_int8());
2012953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitUint8(imm.value() & 0xFF);
2013953437bd51059801d92079295f728d0260efca31Vladimir Marko}
2014953437bd51059801d92079295f728d0260efca31Vladimir Marko
2015953437bd51059801d92079295f728d0260efca31Vladimir Marko
2016953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testl(const Address& dst, const Immediate& imm) {
2017953437bd51059801d92079295f728d0260efca31Vladimir Marko  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2018953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitUint8(0xF7);
2019953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitOperand(0, dst);
2020953437bd51059801d92079295f728d0260efca31Vladimir Marko  EmitImmediate(imm);
2021953437bd51059801d92079295f728d0260efca31Vladimir Marko}
2022953437bd51059801d92079295f728d0260efca31Vladimir Marko
2023953437bd51059801d92079295f728d0260efca31Vladimir Marko
20242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) {
2025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x23);
2027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20319574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) {
20329574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
20339574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitUint8(0x23);
20349574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitOperand(reg, address);
20359574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray}
20369574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20379574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) {
2039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(4, Operand(dst), imm);
2041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) {
2045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2046a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0B);
2047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20519574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) {
20529574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
20539574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitUint8(0x0B);
20549574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitOperand(reg, address);
20559574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray}
20569574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20579574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) {
2059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(1, Operand(dst), imm);
2061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) {
2065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x33);
2067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20709574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20719574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) {
20729574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
20739574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitUint8(0x33);
20749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray  EmitOperand(reg, address);
20759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray}
20769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20779574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
2078b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) {
2079b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2080b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray  EmitComplex(6, Operand(dst), imm);
2081b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray}
2082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20839574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray
20842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) {
2085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(0, Operand(reg), imm);
2087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) {
2091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x01);
2093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
2094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
20972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) {
2098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(0, address, imm);
2100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2103ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffrayvoid X86Assembler::addw(const Address& address, const Immediate& imm) {
2104ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2105ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  CHECK(imm.is_uint16() || imm.is_int16()) << imm.value();
2106ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  EmitUint8(0x66);
2107ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  EmitComplex(0, address, imm, /* is_16_op */ true);
2108ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray}
2109ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray
2110ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray
21112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) {
2112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(2, Operand(reg), imm);
2114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) {
2118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x13);
2120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) {
2125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x13);
2127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, address);
2128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) {
2132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2B);
2134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) {
2139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(5, Operand(reg), imm);
2141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) {
2145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x2B);
2147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
2148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
215109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) {
215209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
215309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x29);
215409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitOperand(reg, address);
215509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
215609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
215709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
21582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() {
2159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x99);
2161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) {
2165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF8 | reg);
2168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) {
2172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
2174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xAF);
2175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
21794a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) {
21804a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
21814a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  // See whether imm can be represented as a sign-extended 8bit value.
21824a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  int32_t v32 = static_cast<int32_t>(imm.value());
21834a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  if (IsInt<8>(v32)) {
21844a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    // Sign-extension works.
21854a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitUint8(0x6B);
21864a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitOperand(dst, Operand(src));
21874a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitUint8(static_cast<uint8_t>(v32 & 0xFF));
21884a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  } else {
21894a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    // Not representable, use full immediate.
21904a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitUint8(0x69);
21914a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitOperand(dst, Operand(src));
21924a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell    EmitImmediate(imm);
21934a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  }
21944a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell}
21954a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell
21964a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell
21972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) {
21984a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell  imull(reg, reg, imm);
2199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) {
2203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
2205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xAF);
2206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
2207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) {
2211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(5, Operand(reg));
2214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) {
2218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(5, address);
2221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) {
2225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(4, Operand(reg));
2228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) {
2232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(4, address);
2235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) {
2239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x1B);
2241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, Operand(src));
2242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) {
2246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitComplex(3, Operand(reg), imm);
2248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) {
2252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x1B);
2254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(dst, address);
2255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
225809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) {
225909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
226009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitUint8(0x19);
226109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell  EmitOperand(src, address);
226209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}
226309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
226409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell
22652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) {
2266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x40 + reg);
2268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) {
2272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
2274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(0, address);
2275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) {
2279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x48 + reg);
2281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) {
2285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
2287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(1, address);
2288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) {
22927394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(4, Operand(reg), imm);
2293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
22962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) {
22977394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(4, Operand(operand), shifter);
22987394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
22997394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23017394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) {
23027394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(4, address, imm);
23037394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23047394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23057394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23067394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) {
23077394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(4, address, shifter);
2308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) {
23127394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(5, Operand(reg), imm);
2313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) {
23177394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(5, Operand(operand), shifter);
23187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23197394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) {
23227394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(5, address, imm);
23237394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23247394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23257394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23267394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) {
23277394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(5, address, shifter);
2328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) {
23327394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(7, Operand(reg), imm);
2333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) {
23377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(7, Operand(operand), shifter);
23387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23407394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) {
23427394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(7, address, imm);
23437394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23447394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23467394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) {
23477394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitGenericShift(7, address, shifter);
2348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23519aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) {
23529aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  DCHECK_EQ(ECX, shifter);
2353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
2355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xA5);
2356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(src, dst);
2357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
23607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) {
23617394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
23627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(0x0F);
23637394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(0xA4);
23647394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitRegisterOperand(src, dst);
23657394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(imm.value() & 0xFF);
23667394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23677394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23687394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23699aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) {
23709aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  DCHECK_EQ(ECX, shifter);
23719aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
23729aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  EmitUint8(0x0F);
23739aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  EmitUint8(0xAD);
23749aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle  EmitRegisterOperand(src, dst);
23759aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle}
23769aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle
23779aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle
23787394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) {
23797394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
23807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(0x0F);
23817394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(0xAC);
23827394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitRegisterOperand(src, dst);
23837394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitUint8(imm.value() & 0xFF);
23847394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell}
23857394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
23867394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell
2387bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register reg, const Immediate& imm) {
2388bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitGenericShift(0, Operand(reg), imm);
2389bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
2390bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2391bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2392bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register operand, Register shifter) {
2393bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitGenericShift(0, Operand(operand), shifter);
2394bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
2395bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2396bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2397bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register reg, const Immediate& imm) {
2398bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitGenericShift(1, Operand(reg), imm);
2399bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
2400bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2401bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2402bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register operand, Register shifter) {
2403bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell  EmitGenericShift(1, Operand(operand), shifter);
2404bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell}
2405bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
2406bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell
24072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) {
2408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(3, Operand(reg));
2411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) {
2415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF7);
2417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD0 | reg);
2418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) {
2422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC8);
2424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(imm.is_uint16());
2425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(imm.value() & 0xFF);
2426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8((imm.value() >> 8) & 0xFF);
2427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x00);
2428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() {
2432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC9);
2434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() {
2438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC3);
2440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) {
2444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xC2);
2446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(imm.is_uint16());
2447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(imm.value() & 0xFF);
2448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8((imm.value() >> 8) & 0xFF);
2449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() {
2454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x90);
2456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() {
2460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xCC);
2462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() {
2466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF4);
2468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
24712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) {
2472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (label->IsBound()) {
2474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    static const int kShortSize = 2;
2475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    static const int kLongSize = 6;
2476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    int offset = label->Position() - buffer_.Size();
2477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    CHECK_LE(offset, 0);
2478ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe    if (IsInt<8>(offset - kShortSize)) {
2479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0x70 + condition);
2480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8((offset - kShortSize) & 0xFF);
2481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    } else {
2482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0x0F);
2483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0x80 + condition);
2484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitInt32(offset - kLongSize);
2485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    }
2486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0x0F);
2488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0x80 + condition);
2489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitLabelLink(label);
2490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
249473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) {
249573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
249673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  if (label->IsBound()) {
249773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    static const int kShortSize = 2;
249873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    int offset = label->Position() - buffer_.Size();
249973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK_LE(offset, 0);
250073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK(IsInt<8>(offset - kShortSize));
250173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0x70 + condition);
250273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8((offset - kShortSize) & 0xFF);
250373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  } else {
250473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0x70 + condition);
250573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitLabelLink(label);
250673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  }
250773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell}
250873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
250973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
251073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) {
251173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
251273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  if (label->IsBound()) {
251373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    static const int kShortSize = 2;
251473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    int offset = label->Position() - buffer_.Size();
251573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK_LE(offset, 0);
251673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK(IsInt<8>(offset - kShortSize));
251773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0xE3);
251873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8((offset - kShortSize) & 0xFF);
251973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  } else {
252073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0xE3);
252173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitLabelLink(label);
252273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  }
252373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell}
252473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
252573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
25262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) {
2527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xFF);
2529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitRegisterOperand(4, reg);
2530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
25327caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) {
25337caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
25347caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  EmitUint8(0xFF);
25357caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers  EmitOperand(4, address);
25367caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers}
2537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
25382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) {
2539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (label->IsBound()) {
2541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    static const int kShortSize = 2;
2542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    static const int kLongSize = 5;
2543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    int offset = label->Position() - buffer_.Size();
2544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    CHECK_LE(offset, 0);
2545ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe    if (IsInt<8>(offset - kShortSize)) {
2546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0xEB);
2547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8((offset - kShortSize) & 0xFF);
2548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    } else {
2549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitUint8(0xE9);
2550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      EmitInt32(offset - kLongSize);
2551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    }
2552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0xE9);
2554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitLabelLink(label);
2555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
255973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) {
256073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
256173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  if (label->IsBound()) {
256273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    static const int kShortSize = 2;
256373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    int offset = label->Position() - buffer_.Size();
256473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK_LE(offset, 0);
256573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK(IsInt<8>(offset - kShortSize));
256673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0xEB);
256773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8((offset - kShortSize) & 0xFF);
256873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  } else {
256973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0xEB);
257073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitLabelLink(label);
257173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  }
257273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell}
257373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
257473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
2575b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::repne_scasb() {
2576b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2577b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xF2);
2578b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xAE);
2579b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo}
2580b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
2581b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
258221030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() {
258321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
258421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe  EmitUint8(0x66);
258521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe  EmitUint8(0xF2);
258621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe  EmitUint8(0xAF);
258721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe}
258821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe
258921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe
2590b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::repe_cmpsb() {
2591b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2592b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xF2);
2593b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xA6);
2594b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo}
2595b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
2596b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
259771311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() {
259871311f868e2579fa5d40b24e620198734119d1a0agicsaki  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
259971311f868e2579fa5d40b24e620198734119d1a0agicsaki  EmitUint8(0x66);
260071311f868e2579fa5d40b24e620198734119d1a0agicsaki  EmitUint8(0xF3);
260171311f868e2579fa5d40b24e620198734119d1a0agicsaki  EmitUint8(0xA7);
260271311f868e2579fa5d40b24e620198734119d1a0agicsaki}
260371311f868e2579fa5d40b24e620198734119d1a0agicsaki
260471311f868e2579fa5d40b24e620198734119d1a0agicsaki
2605970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() {
2606970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2607970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki  EmitUint8(0xF3);
2608970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki  EmitUint8(0xA7);
2609970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki}
2610970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki
2611970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki
2612b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::rep_movsb() {
2613b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2614b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xF3);
2615b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo  EmitUint8(0xA4);
2616b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo}
2617b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
2618b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo
2619b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() {
2620b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2621b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell  EmitUint8(0x66);
2622b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell  EmitUint8(0xF3);
2623b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell  EmitUint8(0xA5);
2624b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell}
2625b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell
2626b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell
26272c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() {
2628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xF0);
26300d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers  return this;
2631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
26342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) {
2635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0x0F);
2637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xB1);
2638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitOperand(reg, address);
2639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
264158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell
264258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) {
264358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
264458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  EmitUint8(0x0F);
264558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  EmitUint8(0xC7);
264658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell  EmitOperand(1, address);
264758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell}
264858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell
264958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell
265079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() {
265179ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
265279ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes  EmitUint8(0x0F);
265379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes  EmitUint8(0xAE);
265479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes  EmitUint8(0xF0);
265579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes}
265679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes
26572c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() {
2658b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  // TODO: fs is a prefix and not an instruction
2659b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2660b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers  EmitUint8(0x64);
26610d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers  return this;
2662b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}
2663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2664befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() {
2665befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers  // TODO: fs is a prefix and not an instruction
2666befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2667befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers  EmitUint8(0x65);
2668befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers  return this;
2669befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers}
2670befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers
26712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) {
2672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  int value = imm.value();
2673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (value > 0) {
2674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    if (value == 1) {
2675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      incl(reg);
2676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    } else if (value != 0) {
2677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      addl(reg, imm);
2678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    }
2679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else if (value < 0) {
2680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    value = -value;
2681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    if (value == 1) {
2682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      decl(reg);
2683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    } else if (value != 0) {
2684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro      subl(reg, Immediate(value));
2685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    }
2686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2690647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) {
2691647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  // TODO: Need to have a code constants table.
2692647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  pushl(Immediate(High32Bits(value)));
2693647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  pushl(Immediate(Low32Bits(value)));
2694647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  movsd(dst, Address(ESP, 0));
2695647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  addl(ESP, Immediate(2 * sizeof(int32_t)));
2696647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain}
2697647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain
2698647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain
26992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) {
2700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  // TODO: Need to have a code constants table.
2701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  int64_t constant = bit_cast<int64_t, double>(value);
2702647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain  LoadLongConstant(dst, constant);
2703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) {
2707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(IsPowerOfTwo(alignment));
2708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  // Emit nop instruction until the real position is aligned.
2709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) {
2710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    nop();
2711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) {
2716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  int bound = buffer_.Size();
2717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(!label->IsBound());  // Labels can only be bound once.
2718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  while (label->IsLinked()) {
2719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    int position = label->LinkPosition();
2720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    int next = buffer_.Load<int32_t>(position);
2721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    buffer_.Store<int32_t>(position, bound - (position + 4));
2722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    label->position_ = next;
2723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  label->BindTo(bound);
2725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
272873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) {
272973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  int bound = buffer_.Size();
273073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  CHECK(!label->IsBound());  // Labels can only be bound once.
273173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  while (label->IsLinked()) {
273273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    int position = label->LinkPosition();
273373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    uint8_t delta = buffer_.Load<uint8_t>(position);
273473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    int offset = bound - (position + 1);
273573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK(IsInt<8>(offset));
273673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    buffer_.Store<int8_t>(position, offset);
273773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    label->position_ = delta != 0u ? label->position_ - delta : 0;
273873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  }
273973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  label->BindTo(bound);
274073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell}
274173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
274273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
274344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) {
274444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  CHECK_GE(reg_or_opcode, 0);
274544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  CHECK_LT(reg_or_opcode, 8);
2746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  const int length = operand.length_;
2747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_GT(length, 0);
274844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  // Emit the ModRM byte updated with the given reg value.
2749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_EQ(operand.encoding_[0] & 0x38, 0);
275044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3));
2751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  // Emit the rest of the encoded operand.
2752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  for (int i = 1; i < length; i++) {
2753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(operand.encoding_[i]);
2754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
27550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  AssemblerFixup* fixup = operand.GetFixup();
27560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  if (fixup != nullptr) {
27570616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    EmitFixup(fixup);
27580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
2759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2762ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffrayvoid X86Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) {
2763ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  if (is_16_op) {
2764ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray    EmitUint8(imm.value() & 0xFF);
2765ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray    EmitUint8(imm.value() >> 8);
2766ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  } else {
2767ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray    EmitInt32(imm.value());
2768ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray  }
2769a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
277244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode,
27732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers                               const Operand& operand,
2774ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray                               const Immediate& immediate,
2775ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray                               bool is_16_op) {
277644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  CHECK_GE(reg_or_opcode, 0);
277744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers  CHECK_LT(reg_or_opcode, 8);
2778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (immediate.is_int8()) {
2779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    // Use sign-extended 8-bit immediate.
2780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0x83);
278144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitOperand(reg_or_opcode, operand);
2782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(immediate.value() & 0xFF);
2783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else if (operand.IsRegister(EAX)) {
2784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    // Use short form if the destination is eax.
278544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitUint8(0x05 + (reg_or_opcode << 3));
2786ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray    EmitImmediate(immediate, is_16_op);
2787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0x81);
278944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers    EmitOperand(reg_or_opcode, operand);
2790ded559460a2c1059e7f6232bb6c0ff954c9d0cf5Nicolas Geoffray    EmitImmediate(immediate, is_16_op);
2791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
27952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) {
2796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (label->IsBound()) {
2797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    int offset = label->Position() - buffer_.Size();
2798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    CHECK_LE(offset, 0);
2799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitInt32(offset - instruction_size);
2800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitLabelLink(label);
2802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
28062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) {
2807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(!label->IsBound());
2808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  int position = buffer_.Size();
2809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitInt32(label->position_);
2810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  label->LinkTo(position);
2811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
281473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) {
281573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  CHECK(!label->IsBound());
281673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  int position = buffer_.Size();
281773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  if (label->IsLinked()) {
281873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    // Save the delta in the byte that we have to play with.
281973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    uint32_t delta = position - label->LinkPosition();
282073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    CHECK(IsUint<8>(delta));
282173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(delta & 0xFF);
282273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  } else {
282373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell    EmitUint8(0);
282473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  }
282573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell  label->LinkTo(position);
282673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell}
282773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
282873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell
282944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode,
28307394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell                                    const Operand& operand,
28312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers                                    const Immediate& imm) {
2832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK(imm.is_int8());
2834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  if (imm.value() == 1) {
2835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0xD1);
28367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell    EmitOperand(reg_or_opcode, operand);
2837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  } else {
2838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(0xC1);
28397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell    EmitOperand(reg_or_opcode, operand);
2840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro    EmitUint8(imm.value() & 0xFF);
2841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  }
2842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
2844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
284544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode,
28467394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell                                    const Operand& operand,
28472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers                                    Register shifter) {
2848a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  CHECK_EQ(shifter, ECX);
2850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro  EmitUint8(0xD3);
28517394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell  EmitOperand(reg_or_opcode, operand);
2852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}
2853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro
28540616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() {
285593205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko  ArrayRef<const int32_t> area = constant_area_.GetBuffer();
28560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Generate the data for the literal area.
28570616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  for (size_t i = 0, e = area.size(); i < e; i++) {
28580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    AssemblerBuffer::EnsureCapacity ensured(&buffer_);
28590616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    EmitInt32(area[i]);
28600616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
28610616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}
28620616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
2863805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) {
2864805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  size_t result = buffer_.size() * elem_size_;
2865805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  buffer_.push_back(v);
2866805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  return result;
2867805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell}
2868805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
2869805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) {
28700616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  for (size_t i = 0, e = buffer_.size(); i < e; i++) {
28710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    if (v == buffer_[i]) {
2872805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell      return i * elem_size_;
28730616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    }
28740616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
28750616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
28760616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Didn't match anything.
2877805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  return AppendInt32(v);
28780616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}
28790616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
2880805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) {
28810616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  int32_t v_low = Low32Bits(v);
28820616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  int32_t v_high = High32Bits(v);
28830616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  if (buffer_.size() > 1) {
28840616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    // Ensure we don't pass the end of the buffer.
28850616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) {
28860616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell      if (v_low == buffer_[i] && v_high == buffer_[i + 1]) {
2887805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell        return i * elem_size_;
28880616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell      }
28890616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    }
28900616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
28910616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
28920616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Didn't match anything.
2893805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  size_t result = buffer_.size() * elem_size_;
28940616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  buffer_.push_back(v_low);
28950616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  buffer_.push_back(v_high);
28960616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  return result;
28970616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}
28980616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
2899805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddDouble(double v) {
29000616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Treat the value as a 64-bit integer value.
29010616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  return AddInt64(bit_cast<int64_t, double>(v));
29020616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}
29030616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
2904805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddFloat(float v) {
29050616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Treat the value as a 32-bit integer value.
29060616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  return AddInt32(bit_cast<int32_t, float>(v));
29070616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}
29080616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
29092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers}  // namespace x86
2910b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers}  // namespace art
2911