assembler_x86.cc revision 953437bd51059801d92079295f728d0260efca31
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 3532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 47724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) { 47824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 47924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 48024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 48124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 48224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 48324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 4842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 518234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) { 519234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 520234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 521234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 522234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x16); 523234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(dst, src); 524234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 525234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 526234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 527234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) { 528234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 529234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 530234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 531234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x17); 532234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(src, dst); 533234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 534234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 535234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 536234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 537234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray DCHECK(shift_count.is_uint8()); 538234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 539234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 540234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 541234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 542234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x73); 543234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitXmmRegisterOperand(3, reg); 544234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(shift_count.value()); 545234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 546234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 547234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 54852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 54952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle DCHECK(shift_count.is_uint8()); 55052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 55152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 55252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 55352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 55452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x73); 55552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(2, reg); 55652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(shift_count.value()); 55752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 55852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 55952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 56052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 56152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 56252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 56352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 56452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x62); 56552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(dst, src); 56652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 56752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 56852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 5692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 728a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 73018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comiss(XmmRegister a, const Address& b) { 73118ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 73218ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x0F); 73318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x2F); 73418ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitOperand(a, b); 73518ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik} 73618ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 73718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 7382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 74718ba121e7d706ce03b5b52f632b7c14cff685eabAart Bikvoid X86Assembler::comisd(XmmRegister a, const Address& b) { 74818ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik AssemblerBuffer::EnsureCapacity ensured(&buffer_); 74918ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x66); 75018ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x0F); 75118ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitUint8(0x2F); 75218ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik EmitOperand(a, b); 75318ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik} 75418ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 75518ba121e7d706ce03b5b52f632b7c14cff685eabAart Bik 756ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 757ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 758ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 759ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 760ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 761ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 762ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 763ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 7649f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomiss(XmmRegister a, const Address& b) { 7659f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 7669f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 7679f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 7689f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 7699f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 7709f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 7719f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 772ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 773ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 774ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 775ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 776ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 777ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 778ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 779ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 780ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 7819f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomisd(XmmRegister a, const Address& b) { 7829f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 7839f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x66); 7849f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 7859f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 7869f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 7879f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 7889f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 7899f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 790fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 791fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 792fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 793fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 794fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 795fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 796fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 797fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 798fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 799fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 800fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 801fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 802fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 803fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 804fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 805fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 806fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 807fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 808fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 809fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 810fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 811fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 8122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 84809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 84909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 85109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 85209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 85309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 85409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 85509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 85609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 85709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 85909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 86009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 86109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 86209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 86309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 86409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 86509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 86609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 86809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 86909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 87009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 87109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 87209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 87309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 88209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 88309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 88409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 88509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 88609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 88709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 88809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 88909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 89809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 89909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 90009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 90109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 90209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(dst, src); 90309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 90409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 90509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 9062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 92224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 92324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 92424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 92524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 92624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 92724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 92824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 93624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 93724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 93924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 94024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 94124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 94224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 94324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 964a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 978a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9790a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) { 9800a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9810a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 9820a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 9830a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 9840a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9850a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 1005a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1012a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 1019a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 102224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 102324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 102424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 102524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 102624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 102724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 102824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 102924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 103024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 103124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 103224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 103324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 103424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 103524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 10362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10423c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10437caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 10447caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10457caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 10467caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 10477caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 10487caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10503b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkovvoid X86Assembler::cmpb(const Address& address, const Immediate& imm) { 10513b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10523b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(0x80); 10533b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitOperand(7, address); 10543b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov EmitUint8(imm.value() & 0xFF); 10553b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov} 10563b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 10573b62593ba55f6bdb37ca84f64930654ff4f09464Serguei Katkov 10583c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 10593c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10603c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 10613c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 10623c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 10633c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10643c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1119f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1120f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1121f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1122f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1123f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1124f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1125f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 11262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1151953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testb(const Address& dst, const Immediate& imm) { 1152953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1153953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF6); 1154953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(EAX, dst); 1155953437bd51059801d92079295f728d0260efca31Vladimir Marko CHECK(imm.is_int8()); 1156953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(imm.value() & 0xFF); 1157953437bd51059801d92079295f728d0260efca31Vladimir Marko} 1158953437bd51059801d92079295f728d0260efca31Vladimir Marko 1159953437bd51059801d92079295f728d0260efca31Vladimir Marko 1160953437bd51059801d92079295f728d0260efca31Vladimir Markovoid X86Assembler::testl(const Address& dst, const Immediate& imm) { 1161953437bd51059801d92079295f728d0260efca31Vladimir Marko AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1162953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitUint8(0xF7); 1163953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitOperand(0, dst); 1164953437bd51059801d92079295f728d0260efca31Vladimir Marko EmitImmediate(imm); 1165953437bd51059801d92079295f728d0260efca31Vladimir Marko} 1166953437bd51059801d92079295f728d0260efca31Vladimir Marko 1167953437bd51059801d92079295f728d0260efca31Vladimir Marko 11682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 11769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11779574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 11789574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11799574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11809574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11819574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11959574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 11969574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11979574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 11989574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11999574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 12009574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 12019574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 12022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12149574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 12159574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 12169574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 12179574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 12189574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 12199574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 12209574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 12219574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1222b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1223b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1224b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1225b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12279574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 12282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 128709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 128809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 128909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 129009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 129109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 129209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 129309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 12942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13154a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) { 13164a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 13174a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // See whether imm can be represented as a sign-extended 8bit value. 13184a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell int32_t v32 = static_cast<int32_t>(imm.value()); 13194a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell if (IsInt<8>(v32)) { 13204a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Sign-extension works. 13214a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x6B); 13224a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 13234a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 13244a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } else { 13254a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Not representable, use full immediate. 13264a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x69); 13274a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 13284a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitImmediate(imm); 13294a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } 13304a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 13314a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 13324a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 13332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 13344a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 139409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 139509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 139609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 139709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 139809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 139909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 140009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 14012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 14287394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(reg), imm); 1429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 14337394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(operand), shifter); 14347394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14357394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) { 14387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, imm); 14397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14407394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14427394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) { 14437394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, shifter); 1444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 14487394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(reg), imm); 1449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 14537394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(operand), shifter); 14547394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14557394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14567394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14577394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) { 14587394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, imm); 14597394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14617394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) { 14637394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, shifter); 1464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 14687394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(reg), imm); 1469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 14737394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(operand), shifter); 14747394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14757394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14767394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14777394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) { 14787394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, imm); 14797394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14817394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14827394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) { 14837394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, shifter); 1484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14879aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 14889aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14967394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) { 14977394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14987394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14997394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xA4); 15007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 15017394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 15027394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 15037394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 15047394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 15059aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 15069aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 15079aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15089aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 15099aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 15109aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 15119aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 15129aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 15139aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 15147394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) { 15157394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15167394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 15177394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xAC); 15187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 15197394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 15207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 15217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 15227394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 1523bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register reg, const Immediate& imm) { 1524bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(reg), imm); 1525bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1526bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1527bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1528bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register operand, Register shifter) { 1529bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(operand), shifter); 1530bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1531bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1532bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1533bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register reg, const Immediate& imm) { 1534bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(reg), imm); 1535bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1536bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1537bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1538bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register operand, Register shifter) { 1539bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(operand), shifter); 1540bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1541bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1542bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 15432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1614ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 163073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) { 163173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 163273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 163373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 163473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 163573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 163673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 163773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 163873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 163973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 164073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 164173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 164273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 164373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 164473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 164573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 164673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) { 164773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 164873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 164973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 165073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 165173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 165273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 165373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 165473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 165573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 165673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 165773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 165873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 165973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 166073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 166173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 16622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16687caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 16697caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16707caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 16717caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 16727caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1681ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 169573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) { 169673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 169773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 169873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 169973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 170073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 170173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 170273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 170373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 170473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 170573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 170673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 170773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 170873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 170973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 171073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 171121030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() { 171221030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 171321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 171421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 171521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 171621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 171721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 171821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 171971311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() { 172071311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 172171311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 172271311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 172371311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 172471311f868e2579fa5d40b24e620198734119d1a0agicsaki} 172571311f868e2579fa5d40b24e620198734119d1a0agicsaki 172671311f868e2579fa5d40b24e620198734119d1a0agicsaki 1727970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() { 1728970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1729970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 1730970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 1731970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 1732970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1733970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1734b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() { 1735b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1736b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 1737b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 1738b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 1739b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 1740b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 1741b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 17422c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 17450d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 175658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 175758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 175858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 175958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 176058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 176158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 176258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 176358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 176458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 176579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 176679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 176779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 176879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 176979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 177079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 177179ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 17722c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1773b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1774b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1775b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 17760d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1777b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1779befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1780befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1781befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1782befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1783befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1784befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1785befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 17862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1805647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 1806647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 1807647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 1808647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 1809647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 1810647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 1811647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1812647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1813647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 18142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1817647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 1818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 184373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) { 184473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 184573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 184673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 184773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 184873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 184973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 185073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 185173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 185273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 185373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 185473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 185573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 185673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 185773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 185844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 185944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 186044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 186344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 186544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 18700616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerFixup* fixup = operand.GetFixup(); 18710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (fixup != nullptr) { 18720616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitFixup(fixup); 18730616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 1874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 188244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 18832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 18842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 188544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 188644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1887a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 189044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 189444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 189844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 192373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) { 192473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 192573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 192673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 192773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 192873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 192973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 193073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 193173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 193273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 193373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 193473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 193573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 193673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 193773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 193844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 19397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 19402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1943a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 19457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 19487394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 195444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 19557394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 19562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 19607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 19630616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() { 196493205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 19650616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Generate the data for the literal area. 19660616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 19670616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 19680616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitInt32(area[i]); 19690616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 19700616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 19710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 1972805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) { 1973805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 1974805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell buffer_.push_back(v); 1975805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return result; 1976805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell} 1977805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell 1978805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) { 19790616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 19800616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v == buffer_[i]) { 1981805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 19820616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 19830616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 19840616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 19850616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 1986805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return AppendInt32(v); 19870616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 19880616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 1989805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) { 19900616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_low = Low32Bits(v); 19910616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_high = High32Bits(v); 19920616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (buffer_.size() > 1) { 19930616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Ensure we don't pass the end of the buffer. 19940616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 19950616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 1996805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 19970616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 19980616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 19990616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 20000616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 20010616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 2002805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 20030616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_low); 20040616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_high); 20050616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 20060616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 20070616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2008805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddDouble(double v) { 20090616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 64-bit integer value. 20100616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 20110616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 20120616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2013805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddFloat(float v) { 20140616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 32-bit integer value. 20150616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 20160616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 20170616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 20182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2019b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2020