assembler_x86.cc revision 0616ae081e648f4b9b64b33e2624a943c5fce977
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 1618ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, Register src) { 1628ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1638ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 1648ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 1658ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitRegisterOperand(dst, src); 1668ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 1678ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 1688ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendellvoid X86Assembler::bsrl(Register dst, const Address& src) { 1698ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1708ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0x0F); 1718ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitUint8(0xBD); 1728ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell EmitOperand(dst, src); 1738ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell} 1748ae3ffb29489a127f2a6242c33845dac8d50e508Mark Mendell 1752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2071bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2601bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 27326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86Assembler::movw(const Address& dst, const Immediate& imm) { 27426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 27526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 27626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 27726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(0, dst); 278b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 27926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 28026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 28126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 28226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 28326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 2842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 294b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2995b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffrayvoid X86Assembler::setb(Condition condition, Register dst) { 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 302b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 3035b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray EmitOperand(0, Operand(dst)); 3047fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 3057fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3067fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 3077fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86Assembler::movaps(XmmRegister dst, XmmRegister src) { 3087fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3097fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 3107fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 3117fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitXmmRegisterOperand(dst, src); 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 43924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) { 44024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 44124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 44224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 44324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 44424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 44524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 4462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 480234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) { 481234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 482234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 483234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 484234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x16); 485234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(dst, src); 486234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 487234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 488234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 489234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) { 490234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 491234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 492234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 493234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x17); 494234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(src, dst); 495234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 496234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 497234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 498234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 499234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray DCHECK(shift_count.is_uint8()); 500234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 501234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 502234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 503234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 504234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x73); 505234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitXmmRegisterOperand(3, reg); 506234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(shift_count.value()); 507234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 508234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 509234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 51052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 51152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle DCHECK(shift_count.is_uint8()); 51252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 51352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 51452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 51552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 51652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x73); 51752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(2, reg); 51852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(shift_count.value()); 51952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 52052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 52152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 52252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 52352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 52452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 52552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 52652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x62); 52752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(dst, src); 52852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 52952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 53052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 5312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 701ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 702ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 703ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 704ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 705ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 706ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 707ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 708ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 709ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 710ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 711ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 712ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 713ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 714ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 715ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 716ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 717ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 718fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 719fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 720fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 721fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 722fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 723fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 724fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 725fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 726fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 727fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 728fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 729fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 730fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 731fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 732fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 733fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 734fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 735fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 736fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 737fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 738fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 739fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 7402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 763a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 765a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 766a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 768a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 769a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 77609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 77709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 77909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 78009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 78109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 78209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 78309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 78409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 78509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 78609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 78709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 78809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 78909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 79009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 79109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 79209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 79309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 79409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 79509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 79609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 79709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 79809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 79909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 80009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 80109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 81009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 81109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 81209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 81309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 81409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 81509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 81609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 81709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 82609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 82709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 82809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 82909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 83009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(dst, src); 83109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 83209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 83309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 848a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 85024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 85124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 85324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 85424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 85524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 85624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 86424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 86524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 86624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 86724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 86824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 86924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 87024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 87124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 882a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 883a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 884a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 885a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 887a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9070a18601f141d864a26d4b74ff5613e69ae411483Roland Levillainvoid X86Assembler::filds(const Address& src) { 9080a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9090a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitUint8(0xDB); 9100a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain EmitOperand(0, src); 9110a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain} 9120a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9130a18601f141d864a26d4b74ff5613e69ae411483Roland Levillain 9142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 925a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 927a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 95024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 95124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 95224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 95324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 95424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 95524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 95624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 95724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 95824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 95924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 96024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 96124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 96224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 96324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9703c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9717caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 9727caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9737caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 9747caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 9757caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 9767caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9783c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 9793c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9803c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 9813c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 9823c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 9833c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9843c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 1015a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1039f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1040f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1041f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1042f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1043f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1044f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1045f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 10462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1053a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1054a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1056a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1058a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10789574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 10799574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10809574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 10819574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 10829574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 10839574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10849574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10989574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 10999574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11009574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 11019574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11029574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11039574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11049574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11179574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11189574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 11199574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11209574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 11219574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 11229574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 11239574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11249574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1125b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1126b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1127b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1128b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11309574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 119009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 119109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 119209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 119309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 119409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 119509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 119609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 11972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12184a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendellvoid X86Assembler::imull(Register dst, Register src, const Immediate& imm) { 12194a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 12204a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // See whether imm can be represented as a sign-extended 8bit value. 12214a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell int32_t v32 = static_cast<int32_t>(imm.value()); 12224a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell if (IsInt<8>(v32)) { 12234a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Sign-extension works. 12244a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x6B); 12254a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12264a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 12274a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } else { 12284a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell // Not representable, use full immediate. 12294a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitUint8(0x69); 12304a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitOperand(dst, Operand(src)); 12314a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell EmitImmediate(imm); 12324a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell } 12334a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell} 12344a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12354a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell 12362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 12374a2aa4af61e653a89f88d776dcdc55f6c7ca05f2Mark Mendell imull(reg, reg, imm); 1238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 129709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 129809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 129909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 130009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 130109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 130209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 130309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 13042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 13317394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(reg), imm); 1332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 13367394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, Operand(operand), shifter); 13377394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13397394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13407394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, const Immediate& imm) { 13417394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, imm); 13427394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13437394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13447394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13457394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shll(const Address& address, Register shifter) { 13467394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(4, address, shifter); 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 13517394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(reg), imm); 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 13567394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, Operand(operand), shifter); 13577394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13587394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13597394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13607394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, const Immediate& imm) { 13617394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, imm); 13627394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13637394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13647394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13657394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrl(const Address& address, Register shifter) { 13667394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(5, address, shifter); 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 13717394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(reg), imm); 1372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 13767394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, Operand(operand), shifter); 13777394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13787394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13797394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13807394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, const Immediate& imm) { 13817394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, imm); 13827394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 13837394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13847394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 13857394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::sarl(const Address& address, Register shifter) { 13867394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitGenericShift(7, address, shifter); 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13909aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 13919aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13997394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shld(Register dst, Register src, const Immediate& imm) { 14007394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14017394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14027394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xA4); 14037394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14047394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14057394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14067394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14077394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14089aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 14099aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 14109aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14119aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 14129aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 14139aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 14149aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 14159aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14169aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 14177394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendellvoid X86Assembler::shrd(Register dst, Register src, const Immediate& imm) { 14187394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14197394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0x0F); 14207394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(0xAC); 14217394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitRegisterOperand(src, dst); 14227394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitUint8(imm.value() & 0xFF); 14237394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell} 14247394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14257394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell 14262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1497ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 151373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::j(Condition condition, NearLabel* label) { 151473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 151573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 151673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 151773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 151873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 151973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 152073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 152173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 152273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 152373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0x70 + condition); 152473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 152573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 152673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 152773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 152873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 152973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jecxz(NearLabel* label) { 153073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 153173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 153273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 153373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 153473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 153573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 153673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 153773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 153873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 153973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xE3); 154073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 154173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 154273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 154373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 154473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 15452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15517caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 15527caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15537caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 15547caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 15557caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1564ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 157873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::jmp(NearLabel* label) { 157973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 158073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsBound()) { 158173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell static const int kShortSize = 2; 158273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = label->Position() - buffer_.Size(); 158373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK_LE(offset, 0); 158473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset - kShortSize)); 158573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 158673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8((offset - kShortSize) & 0xFF); 158773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 158873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0xEB); 158973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitLabelLink(label); 159073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 159173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 159273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 159373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 159421030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampevoid X86Assembler::repne_scasw() { 159521030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe AssemblerBuffer::EnsureCapacity ensured(&buffer_); 159621030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0x66); 159721030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xF2); 159821030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe EmitUint8(0xAF); 159921030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe} 160021030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 160121030dd59b1e350f6f43de39e3c4ce0886ff539cAndreas Gampe 160271311f868e2579fa5d40b24e620198734119d1a0agicsakivoid X86Assembler::repe_cmpsw() { 160371311f868e2579fa5d40b24e620198734119d1a0agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 160471311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0x66); 160571311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xF3); 160671311f868e2579fa5d40b24e620198734119d1a0agicsaki EmitUint8(0xA7); 160771311f868e2579fa5d40b24e620198734119d1a0agicsaki} 160871311f868e2579fa5d40b24e620198734119d1a0agicsaki 160971311f868e2579fa5d40b24e620198734119d1a0agicsaki 1610970abfb65530b700f3a0cc8b90b131df5420cec3agicsakivoid X86Assembler::repe_cmpsl() { 1611970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1612970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xF3); 1613970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki EmitUint8(0xA7); 1614970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki} 1615970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1616970abfb65530b700f3a0cc8b90b131df5420cec3agicsaki 1617b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendellvoid X86Assembler::rep_movsw() { 1618b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1619b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0x66); 1620b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xF3); 1621b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell EmitUint8(0xA5); 1622b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell} 1623b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 1624b9c4bbee9364a9351376fd1fec9604e7c84778d8Mark Mendell 16252c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 16280d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 163958d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 164058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 164158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 164258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 164358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 164458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 164558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 164658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 164758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 164879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 164979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 165079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 165179ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 165279ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 165379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 165479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 16552c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1656b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1657b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1658b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 16590d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1660b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1662befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1663befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1664befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1665befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1666befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1667befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1668befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 16692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1688647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 1689647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 1690647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 1691647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 1692647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 1693647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 1694647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1695647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1696647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 16972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1700647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 1701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 172673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::Bind(NearLabel* label) { 172773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int bound = buffer_.Size(); 172873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); // Labels can only be bound once. 172973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell while (label->IsLinked()) { 173073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = label->LinkPosition(); 173173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint8_t delta = buffer_.Load<uint8_t>(position); 173273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int offset = bound - (position + 1); 173373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsInt<8>(offset)); 173473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell buffer_.Store<int8_t>(position, offset); 173573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->position_ = delta != 0u ? label->position_ - delta : 0; 173673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 173773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->BindTo(bound); 173873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 173973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 174073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 174144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 174244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 174344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 174644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 174844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 17530616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerFixup* fixup = operand.GetFixup(); 17540616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (fixup != nullptr) { 17550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitFixup(fixup); 17560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 1757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1763a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 176544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 17662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 17672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 176844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 176944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 177344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 177744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 178144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 17982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 180673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendellvoid X86Assembler::EmitLabelLink(NearLabel* label) { 180773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(!label->IsBound()); 180873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell int position = buffer_.Size(); 180973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell if (label->IsLinked()) { 181073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell // Save the delta in the byte that we have to play with. 181173f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell uint32_t delta = position - label->LinkPosition(); 181273f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell CHECK(IsUint<8>(delta)); 181373f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(delta & 0xFF); 181473f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } else { 181573f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell EmitUint8(0); 181673f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell } 181773f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell label->LinkTo(position); 181873f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell} 181973f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 182073f455ecb76d063846a82735eb80596ceee8cee3Mark Mendell 182144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 18227394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 18232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 18287394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 18317394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 183744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 18387394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell const Operand& operand, 18392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 18437394569c9252b277710b2d7d3fc35fb0dd48fc4bMark P Mendell EmitOperand(reg_or_opcode, operand); 1844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1846dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbeckystatic dwarf::Reg DWARFReg(Register reg) { 1847dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky return dwarf::Reg::X86Core(static_cast<int>(reg)); 1848dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky} 1849dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky 1850790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 1851790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 18522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1853b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1854fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& entry_spills) { 18558c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky DCHECK_EQ(buffer_.Size(), 0U); // Nothing emitted yet. 1856dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.SetCurrentCFAOffset(4); // Return address on stack. 185706b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1858966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell int gpr_count = 0; 1859703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (int i = spill_regs.size() - 1; i >= 0; --i) { 18608c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 18618c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky pushl(spill); 1862966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell gpr_count++; 1863dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1864dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RelOffset(DWARFReg(spill), 0); 1865703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1866547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 18678c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky // return address then method on stack. 1868e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int32_t adjust = frame_size - gpr_count * kFramePointerSize - 1869e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*method*/ - 1870e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kFramePointerSize /*return address*/; 1871547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen addl(ESP, Immediate(-adjust)); 1872dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 18732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1874dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(kFramePointerSize); 1875dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky DCHECK_EQ(static_cast<size_t>(cfi_.GetCurrentCFAOffset()), frame_size); 1876547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1877b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1878966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell ManagedRegisterSpill spill = entry_spills.at(i); 1879966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.AsX86().IsCpuRegister()) { 18808c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky int offset = frame_size + spill.getSpillOffset(); 18818c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky movl(Address(ESP, offset), spill.AsX86().AsCpuRegister()); 1882966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1883966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.AsX86().IsXmmRegister()); 1884966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.getSize() == 8) { 1885966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movsd(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1886966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1887966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell CHECK_EQ(spill.getSize(), 4); 1888966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movss(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1889966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1890966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1891b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1892b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1893b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1894e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::RemoveFrame(size_t frame_size, const std::vector<ManagedRegister>& spill_regs) { 189506b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1896dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RememberState(); 1897e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier // -kFramePointerSize for ArtMethod*. 1898e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier int adjust = frame_size - spill_regs.size() * kFramePointerSize - kFramePointerSize; 18998c57831b2b07185ee1986b9af68a351e1ca584c3David Srbecky addl(ESP, Immediate(adjust)); 1900dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1901703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (size_t i = 0; i < spill_regs.size(); ++i) { 1902dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky Register spill = spill_regs.at(i).AsX86().AsCpuRegister(); 1903dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky popl(spill); 1904dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-static_cast<int>(kFramePointerSize)); 1905dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.Restore(DWARFReg(spill)); 1906703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1907b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1908dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky // The CFI should be restored for any code that follows the exit block. 1909dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.RestoreState(); 1910dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.DefCFAOffset(frame_size); 1911b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1912b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 191406b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1915b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1916dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(adjust); 1917b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1918b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 192006b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1921b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1922dd97393aca1a3ff2abec4dc4f78d7724300971bcDavid Srbecky cfi_.AdjustCFAOffset(-adjust); 1923b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1924b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 19262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 192745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 192845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 192945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 1930b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1931b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 19329b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 19339b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 19349b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 19359b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 19369b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 193745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 193845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 193945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 194045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 194145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 194245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 194345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 194445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 1945b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1946b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1947b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1948b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1949b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1950b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1951b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1952b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 19542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1955b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1956b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1957b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1958b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 19602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1961df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 1962df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1963df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 1964df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 19652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 19662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 19672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 19682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 19692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1970dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, 19712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 19722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 19732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 19742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1975dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, 19762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 19772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 19782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1979b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 19802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 19812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1982b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1983b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1984dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackPointerToThread32(ThreadOffset<4> thr_offs) { 19852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 1986b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1987b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19881bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 19891bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 19902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 1991b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1992b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 19942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 199545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 199645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 199745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 1998b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1999b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 20009b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 20019b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 20029b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 20039b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 200445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 200545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 200645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 200745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 200845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 200945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2010b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 201145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 201245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 201345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 201445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 201545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 201645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 2017b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2018b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2019b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2020dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadFromThread32(ManagedRegister mdest, ThreadOffset<4> src, size_t size) { 20215a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 20225a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 20235a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 20245a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 20255a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 20265a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 20275a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 20285a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 20295a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 2030dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset<4>(src.Int32Value()+4))); 20315a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 20325a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 20335a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 20345a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20355a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 20365a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20375a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20385a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 20395a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 20405a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 20415a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 20425a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 20435a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20445a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 20455a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 20465a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2047e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 20482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2049b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 2050b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 2051b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2052b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2053e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiervoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, MemberOffset offs, 20544d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain bool unpoison_reference) { 20552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2056b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 20572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 20584d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain if (unpoison_reference) { 20594d02711ea578dbb789abb30cbaf12f9926e13d81Roland Levillain MaybeUnpoisonHeapReference(dest.AsCpuRegister()); 2060e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi } 2061a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 2062a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 20632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 20642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 20652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2066a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 20672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 2068b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2069b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2070dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadRawPtrFromThread32(ManagedRegister mdest, 2071dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> offs) { 20722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 2073b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 20740d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 2075b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2076b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 207758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhaovoid X86Assembler::SignExtend(ManagedRegister mreg, size_t size) { 207858136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao X86ManagedRegister reg = mreg.AsX86(); 207958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(size == 1 || size == 2) << size; 208058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(reg.IsCpuRegister()) << reg; 208158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao if (size == 1) { 208258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxb(reg.AsCpuRegister(), reg.AsByteRegister()); 208358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } else { 208458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 208558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } 208658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao} 208758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 2088cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhaovoid X86Assembler::ZeroExtend(ManagedRegister mreg, size_t size) { 2089cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao X86ManagedRegister reg = mreg.AsX86(); 2090cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(size == 1 || size == 2) << size; 2091cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(reg.IsCpuRegister()) << reg; 2092cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao if (size == 1) { 2093cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxb(reg.AsCpuRegister(), reg.AsByteRegister()); 2094cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } else { 2095cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 2096cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } 2097cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao} 2098cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 2099b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 21002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 21012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 21022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 21032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 21042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 2105b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 2106b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 2107b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 2108b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 2109b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2110b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 2111b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 2112b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 2113b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 2114b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 2115b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 2116b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 2117b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 21182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 21192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 21202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 21212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 21222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 2123b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2124b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 21262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2128b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 21292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 21302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 2131b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2132b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2133dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrFromThread32(FrameOffset fr_offs, 2134dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> thr_offs, 21352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2137b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 21382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 21392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 214045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 214145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 2142dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrToThread32(ThreadOffset<4> thr_offs, 21432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 21442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 21462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 21472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 21482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 2149b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2150b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 21522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 21532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 21542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2155b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 2156b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 2157b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 2158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 2159b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 2160b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2161b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 2162b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 2163b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2164b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2165b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 21661bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 21671bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 2168dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 2169dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2170dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 21715a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 21725a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 21735a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 21745a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 21755a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 21765a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 21775a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 21785a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2179dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 2180dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 2181dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2182dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 2183dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 2184dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 2185dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 2186dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2187dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 21885a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 21895a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 21905a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 21915a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 21925a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 21935a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 21945a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 21955a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 21965a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 21975a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 21985a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 2199dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2200dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 22015a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 22025a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 22035a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 2204dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 2205dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2206dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 2207e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 220879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 2209e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 2210e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 2211eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(ManagedRegister mout_reg, 2212eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 22132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 22142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 22152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2216b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2217b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2218408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 2219b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2220b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2221b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2222b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2223b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2224b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 222518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2226eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2227b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2228b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2229eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2230b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2231b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2232b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2233eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(FrameOffset out_off, 2234eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 22352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 22362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 22372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2238b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 2239b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2240b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2241eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier movl(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2242b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 224318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2244eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2245b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2246b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2247eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2248b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2249b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 2250b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2251b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2252eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Given a handle scope entry, load the associated reference. 2253eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::LoadReferenceFromHandleScope(ManagedRegister mout_reg, 22542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 22552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 22562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2257b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2258b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2259b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2260b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2261b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2262b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2263b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 226418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2265b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 2266b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2267b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2268b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22691bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 2270b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2271b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2272b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22731bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 2274b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2275b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2276b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 22772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 22782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 2279b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 2280df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 2281b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 2282b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2283b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 228467375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 228567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 228667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 228767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 2288e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 2289e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 2290dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CallFromThread32(ThreadOffset<4> offset, ManagedRegister /*mscratch*/) { 2291bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 2292668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2293668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 22942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 22952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 2296dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers Address::Absolute(Thread::SelfOffset<4>())); 2297668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2298668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 22992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 23002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 23012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2302dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset<4>())); 2303668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 2304668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2305668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 230600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { 230700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers X86ExceptionSlowPath* slow = new X86ExceptionSlowPath(stack_adjust); 230845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 2309dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<4>()), Immediate(0)); 231018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 231145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 23120d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 23132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 23142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 23150d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 23160d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 231720cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 231800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (stack_adjust_ != 0) { // Fix up the frame. 231900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers __ DecreaseFrameSize(stack_adjust_); 232000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 232167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 2322dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset<4>())); 2323dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->call(Address::Absolute(QUICK_ENTRYPOINT_OFFSET(4, pDeliverException))); 232467375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 232567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 23260d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 232745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 232845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 23290616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellvoid X86Assembler::AddConstantArea() { 23300616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell const std::vector<int32_t>& area = constant_area_.GetBuffer(); 23310616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Generate the data for the literal area. 23320616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = area.size(); i < e; i++) { 23330616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 23340616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell EmitInt32(area[i]); 23350616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23360616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23370616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23380616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddInt32(int32_t v) { 23390616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size(); i < e; i++) { 23400616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v == buffer_[i]) { 23410616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return i * kEntrySize; 23420616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23430616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23440616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23450616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 23460616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int result = buffer_.size() * kEntrySize; 23470616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v); 23480616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 23490616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23500616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23510616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddInt64(int64_t v) { 23520616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_low = Low32Bits(v); 23530616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int32_t v_high = High32Bits(v); 23540616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (buffer_.size() > 1) { 23550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Ensure we don't pass the end of the buffer. 23560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 23570616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 23580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return i * kEntrySize; 23590616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23600616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23610616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell } 23620616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23630616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Didn't match anything. 23640616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell int result = buffer_.size() * kEntrySize; 23650616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_low); 23660616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell buffer_.push_back(v_high); 23670616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return result; 23680616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23690616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23700616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddDouble(double v) { 23710616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 64-bit integer value. 23720616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt64(bit_cast<int64_t, double>(v)); 23730616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23740616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23750616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellint ConstantArea::AddFloat(float v) { 23760616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell // Treat the value as a 32-bit integer value. 23770616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell return AddInt32(bit_cast<int32_t, float>(v)); 23780616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell} 23790616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell 23802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2381b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2382