assembler_x86.cc revision 3ae3b59e3354d1d387d216ac2fa5d481d3f2e833
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 352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Register reg) { 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 38a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(2, reg); 39a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 40a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(const Address& address) { 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(2, address); 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 48a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Label* label) { 50a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE8); 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kSize = 5; 531cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray // Offset by one because we already have emitted the opcode. 541cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray EmitLabel(label, kSize - 1); 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 588ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffrayvoid X86Assembler::call(const ExternalLabel& label) { 598ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 608ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray intptr_t call_start = buffer_.GetPosition(); 618ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitUint8(0xE8); 628ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitInt32(label.address()); 638ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray static const intptr_t kCallExternalLabelSize = 5; 648ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize); 658ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray} 668ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 678ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(Register reg) { 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x50 + reg); 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Address& address) { 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(6, address); 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Immediate& imm) { 82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 8344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers if (imm.is_int8()) { 8444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x6A); 8544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(imm.value() & 0xFF); 8644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } else { 8744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x68); 8844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitImmediate(imm); 8944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 92a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(Register reg) { 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58 + reg); 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(const Address& address) { 100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8F); 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Immediate& imm) { 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB8 + dst); 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, Register src) { 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Address& src) { 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8B); 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, Register src) { 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, const Immediate& imm) { 135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC7); 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, dst); 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 141bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::movl(const Address& dst, Label* lbl) { 142bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 143bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitUint8(0xC7); 144bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitOperand(0, dst); 145bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitLabel(lbl, dst.length_ + 5); 146bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers} 147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1487a08fb53bd13c74dec92256bef22a37250db1373Mark Mendellvoid X86Assembler::movntl(const Address& dst, Register src) { 1497a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1507a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0x0F); 1517a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitUint8(0xC3); 1527a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell EmitOperand(src, dst); 1537a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell} 1547a08fb53bd13c74dec92256bef22a37250db1373Mark Mendell 15509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::bswapl(Register dst) { 15609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 15809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0xC8 + dst); 15909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 16009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 161bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::bsfl(Register dst, Register src) { 162bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 163bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 164bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 165bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitRegisterOperand(dst, src); 166bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 167bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 168bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::bsfl(Register dst, const Address& src) { 169bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 170bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0x0F); 171bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitUint8(0xBC); 172bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitOperand(dst, src); 173bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 174bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1758ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, Register src) { 1768ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1778ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 1788ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 1798ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst, src); 1808ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 1818ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 1828ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, const Address& src) { 1838ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1848ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 1858ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 1868ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst, src); 1878ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 1888ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 189c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bikvoid X86Assembler::popcntl(Register dst, Register src) { 190c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 191c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0xF3); 192c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0x0F); 193c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0xB8); 194c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitRegisterOperand(dst, src); 195c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik} 196c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik 197c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bikvoid X86Assembler::popcntl(Register dst, const Address& src) { 198c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 199c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0xF3); 200c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0x0F); 201c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitUint8(0xB8); 202c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik EmitOperand(dst, src); 203c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik} 204c39dac148cce137ffd78a8e43499fba10c5c79e0Aart Bik 2052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2371bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2901bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 30326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86Assembler::movw(const Address& dst, const Immediate& imm) { 30426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 30526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 30626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 30726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(0, dst); 308b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 30926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 31026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 31126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 31226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 31326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 3142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 324b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 329abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendellvoid X86Assembler::cmovl(Condition condition, Register dst, const Address& src) { 330abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x0F); 332abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitUint8(0x40 + condition); 333abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell EmitOperand(dst, src); 334abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell} 335abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 336abdac47c3c471d034a5b81aec35bf4201ba86a88Mark Mendell 3375b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffrayvoid X86Assembler::setb(Condition condition, Register dst) { 338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 340b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 3415b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray EmitOperand(0, Operand(dst)); 3427fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 3437fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3447fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3457fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86Assembler::movaps(XmmRegister dst, XmmRegister src) { 3467fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3477fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 3487fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 3497fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitXmmRegisterOperand(dst, src); 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 353c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movaps(XmmRegister dst, const Address& src) { 354c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 355c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 356c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 357c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst, src); 358c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 359c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 360c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 361c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movups(XmmRegister dst, const Address& src) { 362c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 363c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 364c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 365c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst, src); 366c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 367c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 368c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 369c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movaps(const Address& dst, XmmRegister src) { 370c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 371c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 372c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 373c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src, dst); 374c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 375c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 376c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 377c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movups(const Address& dst, XmmRegister src) { 378c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 379c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 380c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 381c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src, dst); 382c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 383c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 384c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 3852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 502c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::addps(XmmRegister dst, XmmRegister src) { 503c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 504c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 505c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 506c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 507c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 508c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 509c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 510c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::subps(XmmRegister dst, XmmRegister src) { 511c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 512c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 513c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 514c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 515c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 516c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 517c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 518c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::mulps(XmmRegister dst, XmmRegister src) { 519c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 520c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 521c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 522c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 523c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 524c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 525c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 526c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::divps(XmmRegister dst, XmmRegister src) { 527c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 528c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 529c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 530c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 531c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 532c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 533c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 534c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(XmmRegister dst, XmmRegister src) { 535c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 536c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 537c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 538c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 539c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 540c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 541c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 542c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 543c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(XmmRegister dst, const Address& src) { 544c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 545c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 546c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 547c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x28); 548c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst, src); 549c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 550c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 551c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 552c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movupd(XmmRegister dst, const Address& src) { 553c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 554c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 555c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 556c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x10); 557c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(dst, src); 558c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 559c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 560c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 561c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movapd(const Address& dst, XmmRegister src) { 562c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 563c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 564c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 565c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x29); 566c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src, dst); 567c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 568c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 569c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 570c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::movupd(const Address& dst, XmmRegister src) { 571c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 572c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 573c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 574c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x11); 575c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitOperand(src, dst); 576c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 577c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 578c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 5792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 58624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) { 58724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 58824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 58924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 59024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 59124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 59224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 5932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 627234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) { 628234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 629234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 630234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 631234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x16); 632234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(dst, src); 633234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 634234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 635234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 636234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) { 637234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 638234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 639234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 640234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x17); 641234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(src, dst); 642234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 643234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 644234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 6452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 717c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::addpd(XmmRegister dst, XmmRegister src) { 718c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 719c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 720c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 721c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x58); 722c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 723c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 724c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 725c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 726c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::subpd(XmmRegister dst, XmmRegister src) { 727c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 728c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 729c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 730c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5C); 731c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 732c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 733c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 734c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 735c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::mulpd(XmmRegister dst, XmmRegister src) { 736c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 737c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 738c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 739c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x59); 740c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 741c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 742c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 743c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 744c778226256bced7105fcbb1a028dfbba135c6c29Aart Bikvoid X86Assembler::divpd(XmmRegister dst, XmmRegister src) { 745c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 746c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x66); 747c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x0F); 748c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitUint8(0x5E); 749c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik EmitXmmRegisterOperand(dst, src); 750c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik} 751c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 752c778226256bced7105fcbb1a028dfbba135c6c29Aart Bik 75368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(XmmRegister dst, XmmRegister src) { 75468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 75568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 75668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 75768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 75868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 75968555e952eea58023fa403951b1491496acf0f4bAart Bik} 76068555e952eea58023fa403951b1491496acf0f4bAart Bik 76168555e952eea58023fa403951b1491496acf0f4bAart Bik 76268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(XmmRegister dst, const Address& src) { 76368555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 76468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 76568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 76668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 76768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst, src); 76868555e952eea58023fa403951b1491496acf0f4bAart Bik} 76968555e952eea58023fa403951b1491496acf0f4bAart Bik 77068555e952eea58023fa403951b1491496acf0f4bAart Bik 77168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqu(XmmRegister dst, const Address& src) { 77268555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 77468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 77568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x6F); 77668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst, src); 77768555e952eea58023fa403951b1491496acf0f4bAart Bik} 77868555e952eea58023fa403951b1491496acf0f4bAart Bik 77968555e952eea58023fa403951b1491496acf0f4bAart Bik 78068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqa(const Address& dst, XmmRegister src) { 78168555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 78268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 78368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 78468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 78568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src, dst); 78668555e952eea58023fa403951b1491496acf0f4bAart Bik} 78768555e952eea58023fa403951b1491496acf0f4bAart Bik 78868555e952eea58023fa403951b1491496acf0f4bAart Bik 78968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::movdqu(const Address& dst, XmmRegister src) { 79068555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 79168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xF3); 79268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 79368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x7F); 79468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(src, dst); 79568555e952eea58023fa403951b1491496acf0f4bAart Bik} 79668555e952eea58023fa403951b1491496acf0f4bAart Bik 79768555e952eea58023fa403951b1491496acf0f4bAart Bik 798e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddb(XmmRegister dst, XmmRegister src) { 799e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 800e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 801e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 802e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFC); 803e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 804e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 805e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 806e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 807e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubb(XmmRegister dst, XmmRegister src) { 808e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 809e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 810e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 811e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF8); 812e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 813e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 814e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 815e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 816e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddw(XmmRegister dst, XmmRegister src) { 817e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 818e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 819e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 820e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFD); 821e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 822e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 823e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 824e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 825e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubw(XmmRegister dst, XmmRegister src) { 826e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 827e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 828e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 829e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xF9); 830e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 831e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 832e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 833e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 834e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::pmullw(XmmRegister dst, XmmRegister src) { 835e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 836e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 837e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 838e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD5); 839e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 840e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 841e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 842e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 84368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::paddd(XmmRegister dst, XmmRegister src) { 84468555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 84668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 84768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFE); 84868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 84968555e952eea58023fa403951b1491496acf0f4bAart Bik} 85068555e952eea58023fa403951b1491496acf0f4bAart Bik 85168555e952eea58023fa403951b1491496acf0f4bAart Bik 85268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::psubd(XmmRegister dst, XmmRegister src) { 85368555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 85568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 85668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xFA); 85768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 85868555e952eea58023fa403951b1491496acf0f4bAart Bik} 85968555e952eea58023fa403951b1491496acf0f4bAart Bik 86068555e952eea58023fa403951b1491496acf0f4bAart Bik 86168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pmulld(XmmRegister dst, XmmRegister src) { 86268555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 86468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 86568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x38); 86668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x40); 86768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 86868555e952eea58023fa403951b1491496acf0f4bAart Bik} 86968555e952eea58023fa403951b1491496acf0f4bAart Bik 87068555e952eea58023fa403951b1491496acf0f4bAart Bik 871e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::paddq(XmmRegister dst, XmmRegister src) { 872e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 873e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 874e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 875e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xD4); 876e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 877e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 878e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 879e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 880e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psubq(XmmRegister dst, XmmRegister src) { 881e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 882e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 883e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 884e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0xFB); 885e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 886e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 887e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 888e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 8892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 927a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9613ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bikvoid X86Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) { 9623ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9633ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x0F); 9643ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitUint8(0x5B); 9653ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik EmitXmmRegisterOperand(dst, src); 9663ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik} 9673ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 9683ae3b59e3354d1d387d216ac2fa5d481d3f2e833Aart Bik 9692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 98618ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comiss(XmmRegister a, const Address& b) { 98718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 98818ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x0F); 98918ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x2F); 99018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitOperand(a, b); 99118ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik} 99218ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 99318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 9942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 100318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comisd(XmmRegister a, const Address& b) { 100418ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100518ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x66); 100618ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x0F); 100718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x2F); 100818ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitOperand(a, b); 100918ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik} 101018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 101118ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 1012ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 1013ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1014ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1015ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1016ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 1017ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1018ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1019ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 10209f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomiss(XmmRegister a, const Address& b) { 10219f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10229f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 10239f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 10249f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 10259f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 10269f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 10279f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 1028ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 1029ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1030ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 1031ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 1032ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 1033ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 1034ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 1035ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1036ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 10379f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomisd(XmmRegister a, const Address& b) { 10389f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10399f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x66); 10409f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 10419f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 10429f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 10439f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 10449f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 10459f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 1046fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1047fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1048fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1049fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1050fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1051fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 1052fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 1053fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1054fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1055fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1056fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1057fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1058fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1059fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 1060fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 1061fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 1062fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 1063fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 1064fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 1065fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 1066fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 1067fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 10682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 1071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 110468555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 110509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 110609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 110768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x57); 110868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst, src); 110968555e952eea58023fa403951b1491496acf0f4bAart Bik} 111068555e952eea58023fa403951b1491496acf0f4bAart Bik 111168555e952eea58023fa403951b1491496acf0f4bAart Bik 111268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 111368555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 111468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 111568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x57); 111668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 111768555e952eea58023fa403951b1491496acf0f4bAart Bik} 111868555e952eea58023fa403951b1491496acf0f4bAart Bik 111968555e952eea58023fa403951b1491496acf0f4bAart Bik 112068555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pxor(XmmRegister dst, XmmRegister src) { 112168555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 112268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 112368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 112468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEF); 112509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 112609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 112709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 112809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 112909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 113009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 113109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 113209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 113309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 113409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 113509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 113609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 113709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 113868555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 113909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 114009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 114109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 114268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x54); 114368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitOperand(dst, src); 114468555e952eea58023fa403951b1491496acf0f4bAart Bik} 114568555e952eea58023fa403951b1491496acf0f4bAart Bik 114668555e952eea58023fa403951b1491496acf0f4bAart Bik 114768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 114868555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 114968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 115068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x54); 115109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 115209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 115309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 115409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 115568555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 1156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 115868555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x54); 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 116368555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pand(XmmRegister dst, XmmRegister src) { 116409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 116568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 116609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 116768555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xDB); 116809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 116909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 117009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 117109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 117268555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 117468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 117668555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x56); 1177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 118168555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 118209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 118309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 118468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x56); 118568555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 118609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 118709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 118809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 118968555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::por(XmmRegister dst, XmmRegister src) { 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 119368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0xEB); 119468555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 119812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 119912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 120012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x66); 120112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 120212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 120312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst, src); 120412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 120512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 120612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 120712e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 120812e06edcdc7a986c127aed58dd836d6767d0e21dAart Bikvoid X86Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) { 120912e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121012e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0x0F); 121112e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(0xC6); 121212e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitXmmRegisterOperand(dst, src); 121312e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik EmitUint8(imm.value()); 121412e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik} 121512e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 121612e06edcdc7a986c127aed58dd836d6767d0e21dAart Bik 121768555e952eea58023fa403951b1491496acf0f4bAart Bikvoid X86Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 121868555e952eea58023fa403951b1491496acf0f4bAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121968555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x66); 122068555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x0F); 122168555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(0x70); 122268555e952eea58023fa403951b1491496acf0f4bAart Bik EmitXmmRegisterOperand(dst, src); 122368555e952eea58023fa403951b1491496acf0f4bAart Bik EmitUint8(imm.value()); 122468555e952eea58023fa403951b1491496acf0f4bAart Bik} 122568555e952eea58023fa403951b1491496acf0f4bAart Bik 122668555e952eea58023fa403951b1491496acf0f4bAart Bik 1227e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklbw(XmmRegister dst, XmmRegister src) { 1228e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1229e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1230e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1231e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x60); 1232e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 1233e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1234e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1235e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1236e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklwd(XmmRegister dst, XmmRegister src) { 1237e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1238e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1239e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1240e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x61); 1241e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 1242e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1243e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1244e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1245e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 1246e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1247e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1248e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1249e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x62); 1250e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 1251e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1252e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1253e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1254e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) { 1255e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1256e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1257e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1258e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x6C); 1259e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(dst, src); 1260e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1261e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1262e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1263e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psllw(XmmRegister reg, const Immediate& shift_count) { 1264e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1265e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1266e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1267e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1268e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1269e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1270e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1271e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1272e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1273e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1274e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::pslld(XmmRegister reg, const Immediate& shift_count) { 1275e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1276e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1277e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1278e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1279e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1280e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1281e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1282e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1283e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1284e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1285e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psllq(XmmRegister reg, const Immediate& shift_count) { 1286e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1287e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1288e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1289e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1290e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1291e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(6, reg); 1292e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1293e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1294e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1295e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1296e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psraw(XmmRegister reg, const Immediate& shift_count) { 1297e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1298e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1299e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1300e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1301e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1302e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1303e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1304e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1305e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1306e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1307e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrad(XmmRegister reg, const Immediate& shift_count) { 1308e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1309e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1310e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1311e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1312e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1313e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(4, reg); 1314e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1315e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1316e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1317e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1318e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) { 1319e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1320e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1321e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1322e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1323e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x71); 1324e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1325e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1326e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1327e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1328e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1329e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrld(XmmRegister reg, const Immediate& shift_count) { 1330e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1331e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1332e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1333e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1334e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x72); 1335e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1336e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1337e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1338e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1339e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1340e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 1341e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1342e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1343e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1344e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1345e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1346e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(2, reg); 1347e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1348e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1349e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1350e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1351e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bikvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 1352e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik DCHECK(shift_count.is_uint8()); 1353e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1354e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x66); 1355e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x0F); 1356e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(0x73); 1357e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitXmmRegisterOperand(3, reg); 1358e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik EmitUint8(shift_count.value()); 1359e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik} 1360e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 1361e69d7a9bc042423a89a6d7b6b1c2236911f67b59Aart Bik 13622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 136924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 137024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 137124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 137224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 137324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 137424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 137524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 13762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 1379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 1380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 138324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 138424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 138524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 138624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 138724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 138824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 138924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 139024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 13912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 1395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 1399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 1406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 1408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 1409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 1413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 1415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 1416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 1420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 1422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 1423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14260a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) { 14270a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14280a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 14290a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 14300a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 14310a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 14320a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 14332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 1434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 1441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 1442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 1444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 1445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 1449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 1452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 1456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 1463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 1466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 146924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 147024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 147124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 147224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 147324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 147424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 147524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 147624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 147724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 147824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 147924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 148024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 148124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 148224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 14832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 1484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 1486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14893c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 14907caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 14917caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14927caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 14937caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 14947caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 14957caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 1496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14973b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkovvoid X86Assembler::cmpb(const Address& address, const Immediate& imm) { 14983b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14993b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(0x80); 15003b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOperand(7, address); 15013b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(imm.value() & 0xFF); 15023b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov} 15033b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 15043b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 15053c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 15063c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15073c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 15083c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 15093c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 15103c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 15113c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 15122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 1513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 1515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 1519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 1522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 1526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 1533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 1540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 1547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 1549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1566f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1567f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1568f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1569f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1570f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1571f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1572f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 15732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1598953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testb(const Address& dst, const Immediate& imm) { 1599953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1600953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF6); 1601953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(EAX, dst); 1602953437bd51059801d92079295f728d0260efca31Vladimir Marko CHECK(imm.is_int8()); 1603953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(imm.value() & 0xFF); 1604953437bd51059801d92079295f728d0260efca31Vladimir Marko} 1605953437bd51059801d92079295f728d0260efca31Vladimir Marko 1606953437bd51059801d92079295f728d0260efca31Vladimir Marko 1607953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testl(const Address& dst, const Immediate& imm) { 1608953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1609953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF7); 1610953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(0, dst); 1611953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitImmediate(imm); 1612953437bd51059801d92079295f728d0260efca31Vladimir Marko} 1613953437bd51059801d92079295f728d0260efca31Vladimir Marko 1614953437bd51059801d92079295f728d0260efca31Vladimir Marko 16152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16229574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 16239574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16249574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 16259574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 16269574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 16279574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16289574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16429574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 16439574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16449574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 16459574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 16469574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 16479574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16489574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16619574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16629574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 16639574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16649574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 16659574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 16669574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 16679574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16689574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1669b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1670b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1671b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1672b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 16752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1728a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 173409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 173509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 173609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 173709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 173809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 173909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 174009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 17412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17624a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) { 17634a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 17644a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // See whether imm can be represented as a sign-extended 8bit value. 17654a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell int32_t v32 = static_cast<int32_t>(imm.value()); 17664a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell if (IsInt<8>(v32)) { 17674a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Sign-extension works. 17684a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x6B); 17694a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 17704a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 17714a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } else { 17724a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Not representable, use full immediate. 17734a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x69); 17744a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 17754a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitImmediate(imm); 17764a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } 17774a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 17784a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 17794a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 17802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 17814a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 1782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 184109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 184209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 184309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 184409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 184509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 184609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 184709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 18482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1871a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 18757394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(reg), imm); 1876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 18807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(operand), shifter); 18817394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 18827394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 18837394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 18847394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) { 18857394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, imm); 18867394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 18877394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 18887394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 18897394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) { 18907394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, shifter); 1891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 18957394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(reg), imm); 1896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 19007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(operand), shifter); 19017394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19027394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19037394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19047394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) { 19057394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, imm); 19067394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19077394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19087394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19097394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) { 19107394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, shifter); 1911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 19157394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(reg), imm); 1916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 19207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(operand), shifter); 19217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19227394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19237394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19247394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) { 19257394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, imm); 19267394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19277394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19287394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19297394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) { 19307394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, shifter); 1931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19349aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 19359aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19437394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) { 19447394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 19457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 19467394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xA4); 19477394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 19487394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 19497394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19507394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19517394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19529aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 19539aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 19549aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 19559aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 19569aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 19579aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 19589aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 19599aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 19609aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 19617394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) { 19627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 19637394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 19647394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xAC); 19657394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 19667394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 19677394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 19687394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 19697394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 1970bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register reg, const Immediate& imm) { 1971bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(reg), imm); 1972bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1973bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1974bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1975bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register operand, Register shifter) { 1976bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(operand), shifter); 1977bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1978bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1979bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1980bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register reg, const Immediate& imm) { 1981bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(reg), imm); 1982bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1983bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1984bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1985bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register operand, Register shifter) { 1986bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(operand), shifter); 1987bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1988bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1989bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 19902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 2000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 2001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 2005a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 2007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 2008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 2009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 2010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 2011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2012a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 2015a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 2017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2019a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 2021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 2023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 2027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 2029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 2030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 2031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 2032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 2037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 2039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 2043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 2045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2046a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 2049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 2051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2053a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 20542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 2055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2056a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 2057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 2058a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 2059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 2060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 2061ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 2062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 2063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 2064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 2066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 2067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 2068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 2071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 2072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 2073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 207773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) { 207873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 207973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 208073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 208173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 208273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 208373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 208473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 208573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 208673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 208773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 208873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 208973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 209073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 209173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 209273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 209373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) { 209473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 209573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 209673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 209773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 209873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 209973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 210073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 210173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 210273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 210373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 210473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 210573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 210673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 210773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 210873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 21092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 2110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 2112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 2113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 21157caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 21167caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 21177caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 21187caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 21197caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 2120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 21212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 2122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 2124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 2125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 2126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 2127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 2128ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 2129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 2130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 2131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 2133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 2134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 2137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 2138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 214273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) { 214373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 214473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 214573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 214673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 214773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 214873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 214973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 215073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 215173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 215273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 215373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 215473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 215573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 215673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 215773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 2158b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::repne_scasb() { 2159b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2160b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xF2); 2161b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xAE); 2162b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo} 2163b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 2164b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 216521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() { 216621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 216721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 216821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 216921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 217021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 217121030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 217221030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 2173b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::repe_cmpsb() { 2174b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2175b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xF2); 2176b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xA6); 2177b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo} 2178b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 2179b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 218071311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() { 218171311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 218271311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 218371311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 218471311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 218571311f868e2579fa5d40b24e620198734119d1a0agicsaki} 218671311f868e2579fa5d40b24e620198734119d1a0agicsaki 218771311f868e2579fa5d40b24e620198734119d1a0agicsaki 2188970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() { 2189970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2190970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 2191970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 2192970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 2193970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 2194970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 2195b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojovoid X86Assembler::rep_movsb() { 2196b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2197b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xF3); 2198b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo EmitUint8(0xA4); 2199b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo} 2200b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 2201b03d640c78acad1cf1f8fbeb894ac3366aa164bejessicahandojo 2202b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() { 2203b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2204b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 2205b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 2206b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 2207b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 2208b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 2209b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 22102c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 2211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 22130d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 2214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 22172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 2218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 2220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 2221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 2222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 222458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 222558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 222658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 222758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 222858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 222958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 223058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 223158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 223258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 223379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 223479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 223579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 223679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 223779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 223879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 223979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 22402c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 2241b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 2242b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2243b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 22440d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 2245b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2247befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 2248befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 2249befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2250befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 2251befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 2252befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 2253befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 22542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 2255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 2256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 2257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 2258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 2259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 2260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 2261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 2263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 2264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 2265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 2266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 2267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 2268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2273647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 2274647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 2275647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 2276647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 2277647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 2278647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 2279647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 2280647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 2281647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 22822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 2283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 2284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 2285647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 2286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 22892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 2290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 2291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 2292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 2293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 2294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 22982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 2299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 2300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 2301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 2302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 2303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 2304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 2305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 2306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 2308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 231173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) { 231273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 231373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 231473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 231573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 231673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 231773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 231873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 231973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 232073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 232173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 232273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 232373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 232473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 232573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 232644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 232744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 232844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 2329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 2330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 233144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 2332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 233344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 2334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 2335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 2336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 2337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 23380616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerFixup* fixup = operand.GetFixup(); 23390616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (fixup != nullptr) { 23400616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitFixup(fixup); 23410616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 2342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 23452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 2346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 2347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 235044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 23512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 23522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 235344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 235444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 2355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 2356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 2357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 235844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 2359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 2360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 2361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 236244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 2363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 2364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 236644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 2367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 2368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 23722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 2373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 2374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 2375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 2376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 2377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 2379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 23832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 2384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 2385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 2386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 2387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 2388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 239173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) { 239273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 239373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 239473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 239573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 239673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 239773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 239873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 239973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 240073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 240173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 240273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 240373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 240473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 240573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 240644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 24077394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 24082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 2409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 2411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 2412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 24137394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 2414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 2415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 24167394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 2417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 2418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 2419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 242244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 24237394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 24242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 2425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 2427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 24287394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 2429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 2430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 24310616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() { 243293205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 24330616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Generate the data for the literal area. 24340616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 24350616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24360616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitInt32(area[i]); 24370616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24380616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24390616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2440805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) { 2441805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 2442805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell buffer_.push_back(v); 2443805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return result; 2444805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell} 2445805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell 2446805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) { 24470616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 24480616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v == buffer_[i]) { 2449805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 24500616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24510616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24520616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24530616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 2454805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return AppendInt32(v); 24550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2457805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) { 24580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_low = Low32Bits(v); 24590616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_high = High32Bits(v); 24600616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (buffer_.size() > 1) { 24610616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Ensure we don't pass the end of the buffer. 24620616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 24630616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 2464805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 24650616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24660616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24670616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24680616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24690616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 2470805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 24710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_low); 24720616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_high); 24730616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 24740616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24750616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2476805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddDouble(double v) { 24770616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 64-bit integer value. 24780616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 24790616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24800616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2481805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddFloat(float v) { 24820616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 32-bit integer value. 24830616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 24840616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24850616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2487b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2488