assembler_x86.cc revision 93205e395f777c1dd81d3f164cf9a4aec4bde45f
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 7302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 735a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 738a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 739ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 740ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 741ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 742ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 743ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 744ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 745ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 746ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 7479f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomiss(XmmRegister a, const Address& b) { 7489f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 7499f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 7509f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 7519f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 7529f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 7539f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 7549f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 755ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 756ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 757ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 758ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 759ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 760ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 761ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 762ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 763ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 7649f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendellvoid X86Assembler::ucomisd(XmmRegister a, const Address& b) { 7659f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 7669f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x66); 7679f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x0F); 7689f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitUint8(0x2E); 7699f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell EmitOperand(a, b); 7709f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell} 7719f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 7729f51f26b815fb955a3b91df86d54acd3f41480e4Mark Mendell 773fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 774fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 775fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 776fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 777fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 778fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 779fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 780fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 781fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 782fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 783fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 784fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 785fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 786fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 787fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 788fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 789fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 790fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 791fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 792fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 793fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 794fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 7952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 83109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 83209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 83309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 83409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 83509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 83609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 83709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 83809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 83909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 84009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 84209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 84309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 84409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 84509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 84609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 84709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 84809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 84909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 85109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 85209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 85309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 85409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 85509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 85609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 86509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 86609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 86809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 86909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 87009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 87109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 87209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 88109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 88209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 88309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 88409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 88509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(dst, src); 88609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 88709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 88809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 90524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 90624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 90724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 90824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 90924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 91024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 91124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 91924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 92024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 92124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 92224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 92324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 92424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 92524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 92624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 943a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9620a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) { 9630a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9640a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 9650a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 9660a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 9670a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9680a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 978a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 100524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 100624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 100824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 100924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 101024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 101124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 101224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 101324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 101424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 101524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 101624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 101724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 101824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 10192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10253c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10267caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 10277caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10287caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 10297caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 10307caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 10317caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10333c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 10343c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10353c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 10363c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 10373c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 10383c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10393c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 10402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 1043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 1054a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1056a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1058a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1094f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1095f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1096f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1097f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1098f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1099f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1100f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 11012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11339574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 11349574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11359574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 11369574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11379574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11389574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11399574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11539574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 11549574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11559574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 11569574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11579574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11589574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11599574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11729574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11739574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 11749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 11769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11779574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11789574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11799574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1180b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1181b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1182b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1183b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11859574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 124509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 124609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 124709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 124809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 124909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 125009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 125109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 12522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12734a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) { 12744a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 12754a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // See whether imm can be represented as a sign-extended 8bit value. 12764a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell int32_t v32 = static_cast<int32_t>(imm.value()); 12774a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell if (IsInt<8>(v32)) { 12784a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Sign-extension works. 12794a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x6B); 12804a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12814a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 12824a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } else { 12834a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Not representable, use full immediate. 12844a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x69); 12854a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12864a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitImmediate(imm); 12874a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } 12884a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 12894a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12904a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 12924a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 135209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 135309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 135409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 135509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 135609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 135709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 135809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 13592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 13867394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(reg), imm); 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 13917394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(operand), shifter); 13927394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13937394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13947394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13957394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) { 13967394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, imm); 13977394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13987394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13997394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) { 14017394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, shifter); 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 14067394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(reg), imm); 1407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 14117394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(operand), shifter); 14127394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14137394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14147394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14157394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) { 14167394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, imm); 14177394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14197394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) { 14217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, shifter); 1422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 14267394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(reg), imm); 1427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 14317394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(operand), shifter); 14327394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14337394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14347394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14357394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) { 14367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, imm); 14377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14407394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) { 14417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, shifter); 1442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14459aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 14469aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14547394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) { 14557394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14567394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14577394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xA4); 14587394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14597394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14617394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14639aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 14649aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 14659aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14669aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 14679aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 14689aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 14699aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 14709aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14719aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14727394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) { 14737394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14747394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14757394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xAC); 14767394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14777394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14787394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14797394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 1481bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register reg, const Immediate& imm) { 1482bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(reg), imm); 1483bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1484bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1485bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1486bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register operand, Register shifter) { 1487bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(operand), shifter); 1488bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1489bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1490bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1491bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register reg, const Immediate& imm) { 1492bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(reg), imm); 1493bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1494bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1495bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1496bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register operand, Register shifter) { 1497bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(operand), shifter); 1498bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1499bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1500bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 15012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1572ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 158873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) { 158973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 159073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 159173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 159273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 159373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 159473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 159573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 159673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 159773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 159873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 159973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 160073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 160173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 160273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 160373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 160473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) { 160573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 160673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 160773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 160873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 160973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 161073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 161173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 161273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 161373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 161473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 161573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 161673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 161773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 161873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 161973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 16202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16267caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 16277caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 16287caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 16297caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 16307caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1639ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 165373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) { 165473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 165573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 165673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 165773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 165873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 165973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 166073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 166173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 166273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 166373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 166473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 166573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 166673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 166773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 166873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 166921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() { 167021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 167121030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 167221030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 167321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 167421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 167521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 167621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 167771311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() { 167871311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 167971311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 168071311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 168171311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 168271311f868e2579fa5d40b24e620198734119d1a0agicsaki} 168371311f868e2579fa5d40b24e620198734119d1a0agicsaki 168471311f868e2579fa5d40b24e620198734119d1a0agicsaki 1685970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() { 1686970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1687970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 1688970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 1689970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 1690970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1691970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1692b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() { 1693b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1694b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 1695b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 1696b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 1697b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 1698b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 1699b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 17002c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 17030d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 171458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 171558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 171658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 171758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 171858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 171958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 172058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 172158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 172258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 172379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 172479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 172579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 172679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 172779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 172879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 172979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 17302c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1731b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1732b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1733b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 17340d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1735b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1737befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1738befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1739befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1740befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1741befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1742befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1743befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 17442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1763647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 1764647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 1765647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 1766647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 1767647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 1768647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 1769647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1770647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1771647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 17722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1775647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 1776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1781a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 180173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) { 180273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 180373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 180473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 180573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 180673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 180773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 180873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 180973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 181073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 181173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 181273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 181373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 181473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 181573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 181644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 181744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 181844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 182144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 182344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 18280616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerFixup* fixup = operand.GetFixup(); 18290616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (fixup != nullptr) { 18300616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitFixup(fixup); 18310616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 1832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 184044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 18412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 18422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 184344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 184444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 184844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 185244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 185644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1871a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 188173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) { 188273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 188373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 188473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 188573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 188673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 188773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 188873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 188973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 189073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 189173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 189273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 189373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 189473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 189573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 189644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 18977394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 18982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 19037394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 19067394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 191244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 19137394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 19142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 19187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1921dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbeckystatic dwarf::Reg DWARFReg(Register reg) { 1922dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky return dwarf::Reg::X86Core(static_cast<int>(reg)); 1923dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky} 1924dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky 1925790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 1926790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 19272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1928b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1929fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& entry_spills) { 19308c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky DCHECK_EQ(buffer_.Size(), 0U); // Nothing emitted yet. 1931dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.SetCurrentCFAOffset(4); // Return address on stack. 193206b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1933966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell int gpr_count = 0; 1934703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (int i = spill_regs.size() - 1; i >= 0; --i) { 19358c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 19368c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky pushl(spill); 1937966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell gpr_count++; 1938dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1939dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RelOffset(DWARFReg(spill), 0); 1940703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1941547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 19428c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky // return address then method on stack. 1943e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int32_t adjust = frame_size - gpr_count * kFramePointerSize - 1944e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*method*/ - 1945e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*return address*/; 1946547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen addl(ESP, Immediate(-adjust)); 1947dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 19482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1949dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1950dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky DCHECK_EQ(static_cast<size_t>(cfi_.GetCurrentCFAOffset()), frame_size); 1951547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1952b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1953966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell ManagedRegisterSpill spill = entry_spills.at(i); 1954966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.AsX86().IsCpuRegister()) { 19558c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky int offset = frame_size + spill.getSpillOffset(); 19568c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky movl(Address(ESP, offset), spill.AsX86().AsCpuRegister()); 1957966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1958966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.AsX86().IsXmmRegister()); 1959966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.getSize() == 8) { 1960966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movsd(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1961966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1962966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell CHECK_EQ(spill.getSize(), 4); 1963966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movss(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1964966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1965966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1966b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1967b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1968b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1969e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& spill_regs) { 197006b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1971dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RememberState(); 1972e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier // -kFramePointerSize for ArtMethod*. 1973e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int adjust = frame_size - spill_regs.size() * kFramePointerSize - kFramePointerSize; 19748c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky addl(ESP, Immediate(adjust)); 1975dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1976703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (size_t i = 0; i < spill_regs.size(); ++i) { 1977dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 1978dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky popl(spill); 1979dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-static_cast<int>(kFramePointerSize)); 1980dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.Restore(DWARFReg(spill)); 1981703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1982b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1983dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky // The CFI should be restored for any code that follows the exit block. 1984dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RestoreState(); 1985dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.DefCFAOffset(frame_size); 1986b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1987b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 198906b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1990b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1991dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 1992b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1993b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 199506b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1996b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1997dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1998b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1999b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 20012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 200245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 200345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 200445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 2005b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 2006b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 20079b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 20089b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 20099b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 20109b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 20119b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 201245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 201345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 201445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 201545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 201645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 201745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 201845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 201945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 2020b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 2021b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 2022b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2023b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 2024b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2025b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2026b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2027b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 20292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 2030b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 2031b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 2032b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2033b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 20352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 2036df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 2037df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 2038df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 2039df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 20402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 20412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 20422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 20432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 20442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 2045dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, 20462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 20472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 20482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 20492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 2050dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, 20512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 20522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 20532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2054b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 20552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 20562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 2057b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2058b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2059dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackPointerToThread32(ThreadOffset<4> thr_offs) { 20602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 2061b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2062b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20631bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 20641bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 20652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 2066b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2067b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 20692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 207045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 207145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 207245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 2073b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 2074b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 20759b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 20769b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 20779b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 20789b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 207945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 208045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 208145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 208245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 208345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 208445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2085b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 208645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 208745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 208845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 208945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 209045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 209145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2092b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2093b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2094b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2095dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadFromThread32(ManagedRegister mdest, ThreadOffset<4> src, size_t size) { 20965a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 20975a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 20985a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 20995a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 21005a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 21015a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 21025a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 21035a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 21045a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 2105dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset<4>(src.Int32Value()+4))); 21065a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 21075a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 21085a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 21095a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 21105a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 21115a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 21125a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 21135a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 21145a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 21155a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 21165a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 21175a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 21185a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 21195a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 21205a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 21215a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2122e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 21232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2124b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 2125b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 2126b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2127b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2128e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, MemberOffset offs, 21294d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain bool unpoison_reference) { 21302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2131b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 21322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 21334d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain if (unpoison_reference) { 21344d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain MaybeUnpoisonHeapReference(dest.AsCpuRegister()); 2135e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi } 2136a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 2137a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 21382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 21392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 21402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2141a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 21422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 2143b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2144b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2145dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadRawPtrFromThread32(ManagedRegister mdest, 2146dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> offs) { 21472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2148b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 21490d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 2150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 215258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhaovoid X86Assembler::SignExtend(ManagedRegister mreg, size_t size) { 215358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao X86ManagedRegister reg = mreg.AsX86(); 215458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(size == 1 || size == 2) << size; 215558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(reg.IsCpuRegister()) << reg; 215658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao if (size == 1) { 215758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxb(reg.AsCpuRegister(), reg.AsByteRegister()); 215858136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } else { 215958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 216058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } 216158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao} 216258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 2163cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhaovoid X86Assembler::ZeroExtend(ManagedRegister mreg, size_t size) { 2164cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao X86ManagedRegister reg = mreg.AsX86(); 2165cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(size == 1 || size == 2) << size; 2166cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(reg.IsCpuRegister()) << reg; 2167cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao if (size == 1) { 2168cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxb(reg.AsCpuRegister(), reg.AsByteRegister()); 2169cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } else { 2170cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 2171cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } 2172cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao} 2173cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 2174b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 21752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 21762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 21772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 21782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 21792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 2180b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 2181b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 2182b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 2183b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 2184b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2185b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 2186b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 2187b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 2188b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2189b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 2190b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 2191b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 2192b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 21932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 21942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 21952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 21962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 21972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 2198b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2199b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 22012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 22022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2203b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 22042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 22052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 2206b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2207b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2208dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrFromThread32(FrameOffset fr_offs, 2209dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> thr_offs, 22102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 22112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2212b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 22132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 22142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 221545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 221645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 2217dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrToThread32(ThreadOffset<4> thr_offs, 22182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 22192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 22202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 22212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 22222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 22232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 2224b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2225b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 22272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 22282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 22292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2230b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 2231b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 2232b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 2233b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 2234b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 2235b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2236b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 2237b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 2238b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2239b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2240b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22411bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 22421bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 2243dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 2244dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2245dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 22465a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 22475a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 22485a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 22495a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 22505a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 22515a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 22525a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 22535a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2254dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 2255dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 2256dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2257dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 2258dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 2259dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 2260dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 2261dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2262dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 22635a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 22645a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 22655a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 22665a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 22675a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 22685a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 22695a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 22705a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 22715a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 22725a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 22735a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 2274dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2275dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 22765a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 22775a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 22785a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 2279dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 2280dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2281dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 2282e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 228379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 2284e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 2285e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 2286eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(ManagedRegister mout_reg, 2287eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 22882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 22892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 22902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2291b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2292b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2293408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 2294b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2295b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2296b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2297b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2298b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2299b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 230018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2301eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2302b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2303b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2304eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2305b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2306b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2307b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2308eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(FrameOffset out_off, 2309eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 23102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 23112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 23122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2313b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 2314b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2315b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2316eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier movl(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2317b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 231818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2319eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2320b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2321b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2322eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2323b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2324b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 2325b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2326b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2327eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Given a handle scope entry, load the associated reference. 2328eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::LoadReferenceFromHandleScope(ManagedRegister mout_reg, 23292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 23302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 23312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2332b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2333b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2334b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2335b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2336b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2337b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2338b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 233918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2340b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 2341b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2342b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2343b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23441bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 2345b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2346b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2347b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23481bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 2349b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2350b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2351b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 23532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 2354b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 2355df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 2356b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 2357b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2358b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 235967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 236067375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 236167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 236267375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 2363e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 2364e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 2365dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CallFromThread32(ThreadOffset<4> offset, ManagedRegister /*mscratch*/) { 2366bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 2367668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2368668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 23692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 23702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 2371dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers Address::Absolute(Thread::SelfOffset<4>())); 2372668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2373668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 23742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 23752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 23762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2377dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset<4>())); 2378668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 2379668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2380668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 238100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { 238293205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko X86ExceptionSlowPath* slow = new (GetArena()) X86ExceptionSlowPath(stack_adjust); 238345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 2384dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<4>()), Immediate(0)); 238518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 238645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 23870d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 23882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 23892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 23900d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 23910d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 239220cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 239300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (stack_adjust_ != 0) { // Fix up the frame. 239400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers __ DecreaseFrameSize(stack_adjust_); 239500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 239667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 2397dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset<4>())); 2398dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->call(Address::Absolute(QUICK_ENTRYPOINT_OFFSET(4, pDeliverException))); 239967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 240067375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 24010d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 240245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 240345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 24040616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() { 240593205e395f777c1dd81d3f164cf9a4aec4bde45fVladimir Marko ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 24060616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Generate the data for the literal area. 24070616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 24080616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 24090616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitInt32(area[i]); 24100616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24110616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24120616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2413805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AppendInt32(int32_t v) { 2414805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 2415805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell buffer_.push_back(v); 2416805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return result; 2417805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell} 2418805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell 2419805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt32(int32_t v) { 24200616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 24210616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v == buffer_[i]) { 2422805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 24230616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24240616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24250616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24260616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 2427805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return AppendInt32(v); 24280616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24290616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2430805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddInt64(int64_t v) { 24310616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_low = Low32Bits(v); 24320616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_high = High32Bits(v); 24330616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (buffer_.size() > 1) { 24340616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Ensure we don't pass the end of the buffer. 24350616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 24360616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 2437805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell return i * elem_size_; 24380616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24390616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24400616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 24410616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24420616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 2443805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell size_t result = buffer_.size() * elem_size_; 24440616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_low); 24450616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_high); 24460616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 24470616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24480616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2449805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddDouble(double v) { 24500616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 64-bit integer value. 24510616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 24520616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24530616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 2454805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellsize_t ConstantArea::AddFloat(float v) { 24550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 32-bit integer value. 24560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 24570616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2460b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2461