assembler_x86.cc revision bcee092d7b0cbb7181d428115ad98d25ce844061
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 1892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2211bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2741bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 28726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86Assembler::movw(const Address& dst, const Immediate& imm) { 28826a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 28926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 29026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 29126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(0, dst); 292b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 29326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 29426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 29526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 29626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 29726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 2982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 308b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3135b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffrayvoid X86Assembler::setb(Condition condition, Register dst) { 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 316b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 3175b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray EmitOperand(0, Operand(dst)); 3187fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 3197fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3207fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3217fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86Assembler::movaps(XmmRegister dst, XmmRegister src) { 3227fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3237fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 3247fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 3257fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitXmmRegisterOperand(dst, src); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 45324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) { 45424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 45524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 45624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 45724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 45824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 45924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 4602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 494234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) { 495234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 496234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 497234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 498234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x16); 499234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(dst, src); 500234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 501234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 502234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 503234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) { 504234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 505234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 506234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 507234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x17); 508234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(src, dst); 509234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 510234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 511234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 512234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 513234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray DCHECK(shift_count.is_uint8()); 514234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 515234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 516234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 517234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 518234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x73); 519234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitXmmRegisterOperand(3, reg); 520234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(shift_count.value()); 521234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 522234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 523234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 52452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 52552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle DCHECK(shift_count.is_uint8()); 52652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 52752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 52852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 52952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 53052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x73); 53152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(2, reg); 53252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(shift_count.value()); 53352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 53452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 53552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 53652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 53752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 53852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 53952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 54052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x62); 54152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(dst, src); 54252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 54352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 54452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 5452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 715ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 716ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 717ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 718ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 719ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 720ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 721ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 722ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 723ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 724ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 725ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 726ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 727ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 728ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 729ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 730ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 731ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 732fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 733fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 734fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 735fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 736fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 737fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 738fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 739fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 740fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 741fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 742fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 743fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 744fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 745fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 746fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 747fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 748fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 749fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 750fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 751fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 752fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 753fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 7542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 765a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 766a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 767a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 768a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 769a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 79009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 79109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 79209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 79309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 79409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 79509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 79609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 79709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 79809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 79909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 80009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 80109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 80209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 80309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 80409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 80509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 80609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 80709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 80809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 80909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 81009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 81109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 81209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 81309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 81409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 81509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 82409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 82509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 82609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 82709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 82809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 82909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 83009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 83109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 84009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 84109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 84309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 84409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(dst, src); 84509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 84609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 84709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 86424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 86524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 86724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 86824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 86924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 87024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 87824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 87924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 88024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 88124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 88224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 88324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 88424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 88524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 887a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9210a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) { 9220a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9230a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 9240a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 9250a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 9260a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9270a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 96424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 96524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 96624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 96724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 96824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 96924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 97024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 97124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 97224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 97324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 97424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 97524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 97624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 97724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9843c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9857caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 9867caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9877caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 9887caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 9897caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 9907caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9923c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 9933c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9943c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 9953c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 9963c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 9973c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9983c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1015a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 1034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1053f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1054f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1055f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1056f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1057f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1058f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1059f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 10602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10929574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 10939574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10949574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 10959574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 10969574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 10979574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10989574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11129574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 11139574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11149574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 11159574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11169574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11179574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11189574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11319574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11329574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 11339574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11349574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 11359574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11369574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11379574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11389574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1139b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1140b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1141b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1142b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11449574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 120409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 120509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 120609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 120709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 120809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 120909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 121009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 12112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12324a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) { 12334a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 12344a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // See whether imm can be represented as a sign-extended 8bit value. 12354a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell int32_t v32 = static_cast<int32_t>(imm.value()); 12364a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell if (IsInt<8>(v32)) { 12374a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Sign-extension works. 12384a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x6B); 12394a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12404a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 12414a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } else { 12424a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Not representable, use full immediate. 12434a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x69); 12444a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12454a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitImmediate(imm); 12464a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } 12474a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 12484a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12494a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 12514a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 131109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 131209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 131309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 131409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 131509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 131609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 131709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 13182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 13457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(reg), imm); 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 13507394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(operand), shifter); 13517394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13527394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13537394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13547394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) { 13557394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, imm); 13567394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13577394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13587394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13597394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) { 13607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, shifter); 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 13657394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(reg), imm); 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 13707394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(operand), shifter); 13717394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13727394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13737394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13747394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) { 13757394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, imm); 13767394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13777394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13787394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13797394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) { 13807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, shifter); 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 13857394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(reg), imm); 1386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 13907394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(operand), shifter); 13917394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13927394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13937394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13947394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) { 13957394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, imm); 13967394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13977394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13987394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13997394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) { 14007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, shifter); 1401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14049aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 14059aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14137394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) { 14147394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14157394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14167394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xA4); 14177394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14197394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14229aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 14239aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 14249aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14259aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 14269aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 14279aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 14289aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 14299aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14309aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14317394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) { 14327394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14337394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14347394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xAC); 14357394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 1440bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register reg, const Immediate& imm) { 1441bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(reg), imm); 1442bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1443bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1444bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1445bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::roll(Register operand, Register shifter) { 1446bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(0, Operand(operand), shifter); 1447bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1448bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1449bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1450bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register reg, const Immediate& imm) { 1451bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(reg), imm); 1452bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1453bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1454bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1455bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendellvoid X86Assembler::rorl(Register operand, Register shifter) { 1456bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell EmitGenericShift(1, Operand(operand), shifter); 1457bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell} 1458bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 1459bcee092d7b0cbb7181d428115ad98d25ce844061Mark Mendell 14602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1525a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1531ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 154773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) { 154873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 154973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 155073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 155173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 155273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 155373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 155473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 155573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 155673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 155773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 155873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 155973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 156073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 156173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 156273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 156373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) { 156473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 156573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 156673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 156773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 156873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 156973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 157073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 157173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 157273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 157373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 157473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 157573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 157673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 157773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 157873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 15792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15857caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 15867caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15877caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 15887caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 15897caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1598ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 161273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) { 161373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 161473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 161573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 161673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 161773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 161873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 161973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 162073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 162173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 162273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 162373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 162473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 162573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 162673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 162773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 162821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() { 162921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 163021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 163121030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 163221030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 163321030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 163421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 163521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 163671311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() { 163771311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 163871311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 163971311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 164071311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 164171311f868e2579fa5d40b24e620198734119d1a0agicsaki} 164271311f868e2579fa5d40b24e620198734119d1a0agicsaki 164371311f868e2579fa5d40b24e620198734119d1a0agicsaki 1644970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() { 1645970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1646970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 1647970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 1648970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 1649970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1650970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1651b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() { 1652b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1653b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 1654b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 1655b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 1656b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 1657b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 1658b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 16592c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 16620d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 167358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 167458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 167558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 167658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 167758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 167858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 167958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 168058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 168158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 168279ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 168379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 168479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 168579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 168679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 168779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 168879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 16892c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1690b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1691b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1692b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 16930d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1694b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1696befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1697befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1698befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1699befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1700befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1701befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1702befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 17032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1722647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 1723647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 1724647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 1725647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 1726647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 1727647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 1728647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1729647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1730647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 17312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1734647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 1735a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 176073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) { 176173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 176273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 176373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 176473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 176573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 176673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 176773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 176873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 176973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 177073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 177173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 177273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 177373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 177473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 177544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 177644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 177744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 178044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1781a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 178244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 17870616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerFixup* fixup = operand.GetFixup(); 17880616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (fixup != nullptr) { 17890616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitFixup(fixup); 17900616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 179944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 18002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 18012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 180244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 180344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 180744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 181144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 181544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 18322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 184073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) { 184173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 184273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 184373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 184473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 184573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 184673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 184773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 184873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 184973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 185073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 185173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 185273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 185373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 185473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 185544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 18567394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 18572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 18627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 18657394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 187144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 18727394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 18732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 18777394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1880dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbeckystatic dwarf::Reg DWARFReg(Register reg) { 1881dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky return dwarf::Reg::X86Core(static_cast<int>(reg)); 1882dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky} 1883dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky 1884790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 1885790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 18862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1887b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1888fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& entry_spills) { 18898c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky DCHECK_EQ(buffer_.Size(), 0U); // Nothing emitted yet. 1890dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.SetCurrentCFAOffset(4); // Return address on stack. 189106b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1892966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell int gpr_count = 0; 1893703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (int i = spill_regs.size() - 1; i >= 0; --i) { 18948c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 18958c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky pushl(spill); 1896966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell gpr_count++; 1897dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1898dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RelOffset(DWARFReg(spill), 0); 1899703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1900547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 19018c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky // return address then method on stack. 1902e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int32_t adjust = frame_size - gpr_count * kFramePointerSize - 1903e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*method*/ - 1904e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*return address*/; 1905547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen addl(ESP, Immediate(-adjust)); 1906dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 19072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1908dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1909dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky DCHECK_EQ(static_cast<size_t>(cfi_.GetCurrentCFAOffset()), frame_size); 1910547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1911b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1912966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell ManagedRegisterSpill spill = entry_spills.at(i); 1913966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.AsX86().IsCpuRegister()) { 19148c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky int offset = frame_size + spill.getSpillOffset(); 19158c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky movl(Address(ESP, offset), spill.AsX86().AsCpuRegister()); 1916966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1917966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.AsX86().IsXmmRegister()); 1918966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.getSize() == 8) { 1919966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movsd(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1920966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1921966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell CHECK_EQ(spill.getSize(), 4); 1922966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movss(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1923966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1924966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1925b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1926b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1927b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1928e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& spill_regs) { 192906b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1930dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RememberState(); 1931e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier // -kFramePointerSize for ArtMethod*. 1932e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int adjust = frame_size - spill_regs.size() * kFramePointerSize - kFramePointerSize; 19338c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky addl(ESP, Immediate(adjust)); 1934dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1935703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (size_t i = 0; i < spill_regs.size(); ++i) { 1936dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 1937dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky popl(spill); 1938dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-static_cast<int>(kFramePointerSize)); 1939dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.Restore(DWARFReg(spill)); 1940703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1941b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1942dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky // The CFI should be restored for any code that follows the exit block. 1943dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RestoreState(); 1944dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.DefCFAOffset(frame_size); 1945b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1946b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 194806b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1949b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1950dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 1951b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1952b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 195406b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1955b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1956dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1957b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1958b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 19602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 196145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 196245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 196345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 1964b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1965b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 19669b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 19679b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 19689b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 19699b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 19709b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 197145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 197245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 197345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 197445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 197545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 197645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 197745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 197845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 1979b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1980b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1981b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1982b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1983b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1984b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1985b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1986b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 19882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1989b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1990b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1991b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1992b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 19942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1995df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 1996df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1997df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 1998df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 19992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 20002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 20012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 20022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 20032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 2004dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, 20052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 20062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 20072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 20082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 2009dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, 20102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 20112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 20122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2013b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 20142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 20152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 2016b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2017b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2018dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackPointerToThread32(ThreadOffset<4> thr_offs) { 20192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 2020b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2021b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20221bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 20231bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 20242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 2025b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2026b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 20282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 202945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 203045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 203145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 2032b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 2033b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 20349b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 20359b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 20369b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 20379b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 203845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 203945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 204045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 204145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 204245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 204345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2044b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 204545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 204645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 204745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 204845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 204945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 205045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2051b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2052b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2053b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2054dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadFromThread32(ManagedRegister mdest, ThreadOffset<4> src, size_t size) { 20555a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 20565a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 20575a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 20585a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 20595a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 20605a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 20615a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 20625a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 20635a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 2064dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset<4>(src.Int32Value()+4))); 20655a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 20665a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 20675a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 20685a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20695a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 20705a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20715a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20725a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 20735a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 20745a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 20755a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20765a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 20775a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20785a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20795a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 20805a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2081e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 20822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2083b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 2084b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 2085b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2086b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2087e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, MemberOffset offs, 20884d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain bool unpoison_reference) { 20892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2090b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 20912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 20924d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain if (unpoison_reference) { 20934d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain MaybeUnpoisonHeapReference(dest.AsCpuRegister()); 2094e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi } 2095a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 2096a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 20972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 20982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 20992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2100a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 21012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 2102b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2103b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2104dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadRawPtrFromThread32(ManagedRegister mdest, 2105dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> offs) { 21062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2107b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 21080d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 2109b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2110b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 211158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhaovoid X86Assembler::SignExtend(ManagedRegister mreg, size_t size) { 211258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao X86ManagedRegister reg = mreg.AsX86(); 211358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(size == 1 || size == 2) << size; 211458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(reg.IsCpuRegister()) << reg; 211558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao if (size == 1) { 211658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxb(reg.AsCpuRegister(), reg.AsByteRegister()); 211758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } else { 211858136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 211958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } 212058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao} 212158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 2122cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhaovoid X86Assembler::ZeroExtend(ManagedRegister mreg, size_t size) { 2123cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao X86ManagedRegister reg = mreg.AsX86(); 2124cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(size == 1 || size == 2) << size; 2125cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(reg.IsCpuRegister()) << reg; 2126cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao if (size == 1) { 2127cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxb(reg.AsCpuRegister(), reg.AsByteRegister()); 2128cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } else { 2129cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 2130cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } 2131cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao} 2132cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 2133b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 21342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 21352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 21362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 21372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 21382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 2139b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 2140b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 2141b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 2142b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 2143b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2144b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 2145b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 2146b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 2147b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2148b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 2149b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 2150b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 2151b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 21522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 21532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 21542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 21552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 21562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 2157b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 21602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2162b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 21632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 21642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 2165b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2166b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2167dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrFromThread32(FrameOffset fr_offs, 2168dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> thr_offs, 21692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2171b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 21722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 21732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 217445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 217545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 2176dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrToThread32(ThreadOffset<4> thr_offs, 21772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 21782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 21802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 21812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 21822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 2183b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2184b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 21862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 21872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 21882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2189b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 2190b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 2191b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 2192b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 2193b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 2194b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2195b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 2196b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 2197b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2198b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2199b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22001bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 22011bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 2202dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 2203dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2204dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 22055a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 22065a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 22075a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 22085a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 22095a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 22105a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 22115a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 22125a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2213dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 2214dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 2215dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2216dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 2217dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 2218dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 2219dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 2220dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2221dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 22225a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 22235a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 22245a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 22255a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 22265a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 22275a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 22285a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 22295a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 22305a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 22315a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 22325a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 2233dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2234dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 22355a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 22365a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 22375a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 2238dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 2239dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2240dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 2241e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 224279ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 2243e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 2244e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 2245eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(ManagedRegister mout_reg, 2246eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 22472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 22482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 22492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2250b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2251b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2252408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 2253b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2254b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2255b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2256b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2257b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2258b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 225918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2260eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2261b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2262b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2263eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2264b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2265b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2266b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2267eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(FrameOffset out_off, 2268eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 22692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 22702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 22712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2272b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 2273b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2274b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2275eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier movl(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2276b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 227718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2278eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2279b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2280b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2281eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2282b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2283b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 2284b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2285b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2286eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Given a handle scope entry, load the associated reference. 2287eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::LoadReferenceFromHandleScope(ManagedRegister mout_reg, 22882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 22892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 22902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2291b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2292b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2293b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2294b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2295b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2296b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2297b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 229818c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2299b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 2300b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2301b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2302b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23031bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 2304b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2305b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2306b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23071bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 2308b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2309b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2310b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 23112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 23122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 2313b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 2314df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 2315b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 2316b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2317b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 231867375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 231967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 232067375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 232167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 2322e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 2323e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 2324dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CallFromThread32(ThreadOffset<4> offset, ManagedRegister /*mscratch*/) { 2325bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 2326668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2327668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 23282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 23292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 2330dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers Address::Absolute(Thread::SelfOffset<4>())); 2331668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2332668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 23332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 23342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 23352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2336dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset<4>())); 2337668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 2338668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2339668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 234000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { 234100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers X86ExceptionSlowPath* slow = new X86ExceptionSlowPath(stack_adjust); 234245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 2343dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<4>()), Immediate(0)); 234418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 234545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 23460d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 23472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 23482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 23490d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 23500d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 235120cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 235200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (stack_adjust_ != 0) { // Fix up the frame. 235300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers __ DecreaseFrameSize(stack_adjust_); 235400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 235567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 2356dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset<4>())); 2357dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->call(Address::Absolute(QUICK_ENTRYPOINT_OFFSET(4, pDeliverException))); 235867375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 235967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 23600d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 236145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 236245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 23630616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() { 23640616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell const std::vector<int32_t>& area = constant_area_.GetBuffer(); 23650616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Generate the data for the literal area. 23660616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 23670616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23680616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitInt32(area[i]); 23690616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23700616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23720616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddInt32(int32_t v) { 23730616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 23740616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v == buffer_[i]) { 23750616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return i * kEntrySize; 23760616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23770616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23780616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23790616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 23800616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int result = buffer_.size() * kEntrySize; 23810616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v); 23820616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 23830616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23840616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23850616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddInt64(int64_t v) { 23860616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_low = Low32Bits(v); 23870616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_high = High32Bits(v); 23880616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (buffer_.size() > 1) { 23890616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Ensure we don't pass the end of the buffer. 23900616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 23910616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 23920616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return i * kEntrySize; 23930616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23940616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23950616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23960616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23970616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 23980616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int result = buffer_.size() * kEntrySize; 23990616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_low); 24000616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_high); 24010616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 24020616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24030616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24040616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddDouble(double v) { 24050616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 64-bit integer value. 24060616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 24070616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24080616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24090616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddFloat(float v) { 24100616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 32-bit integer value. 24110616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 24120616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 24130616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 24142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2415b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2416