assembler_x86.cc revision 58d25fd052e999a24734b0cf856a1563e3d1b2d0
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" 23547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen#include "utils/dwarf_cfi.h" 24a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 256b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 { 27a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "XMM" << static_cast<int>(reg); 30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const X87Register& reg) { 33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "ST" << static_cast<int>(reg); 34b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 35a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Register reg) { 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 38a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 39a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(2, reg); 40a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 42a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(const Address& address) { 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(2, address); 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 48a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 49a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Label* label) { 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE8); 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kSize = 5; 541cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray // Offset by one because we already have emitted the opcode. 551cf95287364948689f6a1a320567acd7728e94a3Nicolas Geoffray EmitLabel(label, kSize - 1); 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 598ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffrayvoid X86Assembler::call(const ExternalLabel& label) { 608ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 618ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray intptr_t call_start = buffer_.GetPosition(); 628ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitUint8(0xE8); 638ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitInt32(label.address()); 648ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray static const intptr_t kCallExternalLabelSize = 5; 658ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize); 668ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray} 678ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 688ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(Register reg) { 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x50 + reg); 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Address& address) { 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(6, address); 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Immediate& imm) { 83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 8444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers if (imm.is_int8()) { 8544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x6A); 8644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(imm.value() & 0xFF); 8744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } else { 8844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x68); 8944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitImmediate(imm); 9044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 92a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 93a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(Register reg) { 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58 + reg); 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(const Address& address) { 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8F); 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Immediate& imm) { 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB8 + dst); 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, Register src) { 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Address& src) { 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8B); 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, Register src) { 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, const Immediate& imm) { 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC7); 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, dst); 139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 142bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::movl(const Address& dst, Label* lbl) { 143bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 144bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitUint8(0xC7); 145bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitOperand(0, dst); 146bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitLabel(lbl, dst.length_ + 5); 147bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers} 148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::bswapl(Register dst) { 15009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 15109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 15209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0xC8 + dst); 15309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 15409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 1552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1871bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2401bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 25326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffrayvoid X86Assembler::movw(const Address& dst, const Immediate& imm) { 25426a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 25526a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperandSizeOverride(); 25626a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(0xC7); 25726a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitOperand(0, dst); 258b6e7206ad7a426adda9cfd649a4ef969607d79d6Nicolas Geoffray CHECK(imm.is_uint16() || imm.is_int16()); 25926a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() & 0xFF); 26026a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray EmitUint8(imm.value() >> 8); 26126a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray} 26226a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 26326a25ef62a13f409f941aa39825a51b4d6f0f047Nicolas Geoffray 2642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 274b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2795b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffrayvoid X86Assembler::setb(Condition condition, Register dst) { 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 282b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 2835b4b898ed8725242ee6b7229b94467c3ea3054c8Nicolas Geoffray EmitOperand(0, Operand(dst)); 2847fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray} 2857fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 2867fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 2877fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffrayvoid X86Assembler::movaps(XmmRegister dst, XmmRegister src) { 2887fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2897fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x0F); 2907fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitUint8(0x28); 2917fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray EmitXmmRegisterOperand(dst, src); 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 41924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fsts(const Address& dst) { 42024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 42124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 42224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 42324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 42424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 42524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 4262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 460234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(XmmRegister dst, const Address& src) { 461234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 462234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 463234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 464234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x16); 465234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(dst, src); 466234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 467234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 468234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 469234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::movhpd(const Address& dst, XmmRegister src) { 470234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 471234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 472234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 473234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x17); 474234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitOperand(src, dst); 475234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 476234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 477234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 478234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffrayvoid X86Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 479234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray DCHECK(shift_count.is_uint8()); 480234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 481234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 482234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x66); 483234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x0F); 484234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(0x73); 485234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitXmmRegisterOperand(3, reg); 486234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray EmitUint8(shift_count.value()); 487234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray} 488234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 489234d69d075d1608f80adb647f7935077b62b6376Nicolas Geoffray 49052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 49152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle DCHECK(shift_count.is_uint8()); 49252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 49352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 49452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 49552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 49652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x73); 49752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(2, reg); 49852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(shift_count.value()); 49952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 50052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 50152c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 50252c489645b6e9ae33623f1ec24143cde5444906eCalin Juravlevoid X86Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 50352c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 50452c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x66); 50552c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x0F); 50652c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitUint8(0x62); 50752c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle EmitXmmRegisterOperand(dst, src); 50852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle} 50952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 51052c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle 5112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 525a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 681ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomiss(XmmRegister a, XmmRegister b) { 682ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 683ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 684ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 685ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 686ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 687ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 688ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 689ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravlevoid X86Assembler::ucomisd(XmmRegister a, XmmRegister b) { 690ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 691ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x66); 692ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x0F); 693ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitUint8(0x2E); 694ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle EmitXmmRegisterOperand(a, b); 695ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle} 696ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 697ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 698fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 699fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 700fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 701fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 702fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 703fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0B); 704fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 705fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 706fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 707fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 708fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 709fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendellvoid X86Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 710fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 711fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x66); 712fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0F); 713fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x3A); 714fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(0x0A); 715fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitXmmRegisterOperand(dst, src); 716fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell EmitUint8(imm.value()); 717fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell} 718fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 719fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell 7202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 728a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 735a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 75609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, XmmRegister src) { 75709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 75809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 75909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 76009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 76109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 76209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 76309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 76409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andpd(XmmRegister dst, XmmRegister src) { 76509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 76609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 76709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 76809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 76909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 77009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 77109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 77209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 77309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orpd(XmmRegister dst, XmmRegister src) { 77409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x66); 77609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 77709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 77809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 77909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 78009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 78109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 79009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::orps(XmmRegister dst, XmmRegister src) { 79109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 79209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 79309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x56); 79409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitXmmRegisterOperand(dst, src); 79509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 79609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 79709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 80609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::andps(XmmRegister dst, const Address& src) { 80709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 80809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x0F); 80909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x54); 81009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(dst, src); 81109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 81209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 81309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 83024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstl(const Address& dst) { 83124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 83224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDD); 83324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitOperand(2, dst); 83424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 83524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 83624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 84424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fstsw() { 84524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0x9B); 84724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDF); 84824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE0); 84924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 85024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 85124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 8522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 871a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 882a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 883a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 884a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 885a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 886a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 92324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fucompp() { 92424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 92524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xDA); 92624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xE9); 92724f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 92824f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 92924f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 93024f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendellvoid X86Assembler::fprem() { 93124f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93224f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xD9); 93324f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell EmitUint8(0xF8); 93424f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell} 93524f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 93624f2dfae084b2382c053f5d688fd6bb26cb8a328Mark Mendell 9372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9433c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9447caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 9457caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9467caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 9477caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 9487caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 9497caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9513c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffrayvoid X86Assembler::cmpw(const Address& address, const Immediate& imm) { 9523c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 9533c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitUint8(0x66); 9543c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray EmitComplex(7, address, imm); 9553c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray} 9563c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9573c04974a90b0e03f4b509010bff49f0b2a3da57fNicolas Geoffray 9582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1012f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffrayvoid X86Assembler::testl(Register reg, const Address& address) { 1013f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1014f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitUint8(0x85); 1015f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray EmitOperand(reg, address); 1016f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray} 1017f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 1018f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray 10192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 1026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 1033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 1034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1046a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10519574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::andl(Register reg, const Address& address) { 10529574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10539574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x23); 10549574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 10559574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 10569574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10579574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10719574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::orl(Register reg, const Address& address) { 10729574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10739574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x0B); 10749574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 10759574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 10769574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10779574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10909574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10919574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffrayvoid X86Assembler::xorl(Register reg, const Address& address) { 10929574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 10939574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitUint8(0x33); 10949574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray EmitOperand(reg, address); 10959574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray} 10969574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 10979574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 1098b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 1099b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1100b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 1101b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11039574c4b5f5ef039d694ac12c97e25ca02eca83c0Nicolas Geoffray 11042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 1137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 116309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::subl(const Address& address, Register reg) { 116409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 116509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x29); 116609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(reg, address); 116709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 116809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 116909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 11702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 1177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x69); 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, Operand(reg)); 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 1208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 1211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 1215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 1218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 1222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 1225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 1232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 125509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellvoid X86Assembler::sbbl(const Address& address, Register src) { 125609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 125709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitUint8(0x19); 125809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell EmitOperand(src, address); 125909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} 126009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 126109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 12622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 1289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, reg, imm); 1290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, operand, shifter); 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, reg, imm); 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 1304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, operand, shifter); 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, reg, imm); 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, operand, shifter); 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13189aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shld(Register dst, Register src, Register shifter) { 13199aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13279aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravlevoid X86Assembler::shrd(Register dst, Register src, Register shifter) { 13289aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle DCHECK_EQ(ECX, shifter); 13299aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle AssemblerBuffer::EnsureCapacity ensured(&buffer_); 13309aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0x0F); 13319aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitUint8(0xAD); 13329aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle EmitRegisterOperand(src, dst); 13339aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle} 13349aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 13359aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 13362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1407ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14297caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 14307caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 14317caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 14327caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 14337caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1442ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe if (IsInt<8>(offset - kShortSize)) { 1443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14562c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 14590d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 14632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 147058d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 147158d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendellvoid X86Assembler::cmpxchg8b(const Address& address) { 147258d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell AssemblerBuffer::EnsureCapacity ensured(&buffer_); 147358d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0x0F); 147458d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitUint8(0xC7); 147558d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell EmitOperand(1, address); 147658d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell} 147758d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 147858d25fd052e999a24734b0cf856a1563e3d1b2d0Mark Mendell 147979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 148079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 148179ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 148279ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 148379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 148479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 148579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 14862c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1487b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1488b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1489b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 14900d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1491b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1493befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1494befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1495befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1496befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1497befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1498befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1499befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 15002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1519647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillainvoid X86Assembler::LoadLongConstant(XmmRegister dst, int64_t value) { 1520647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain // TODO: Need to have a code constants table. 1521647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(High32Bits(value))); 1522647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain pushl(Immediate(Low32Bits(value))); 1523647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain movsd(dst, Address(ESP, 0)); 1524647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain addl(ESP, Immediate(2 * sizeof(int32_t))); 1525647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain} 1526647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 1527647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain 15282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1531647b9ed41cdb7cf302fd356627a3ba372419b78cRoland Levillain LoadLongConstant(dst, constant); 1532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 155744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 155844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 155944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 156244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 156444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 157744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 15782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 15792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 158044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 158144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 158544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 158944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 159344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 15992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 16102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 161844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 16192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register reg, 16202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 162544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(reg)); 1626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 162844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(reg)); 1629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 163444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 16352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register operand, 16362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 164044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(operand)); 1641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1643547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shenvoid X86Assembler::InitializeFrameDescriptionEntry() { 1644e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban WriteFDEHeader(&cfi_info_, false /* is_64bit */); 1645547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen} 1646547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1647547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shenvoid X86Assembler::FinalizeFrameDescriptionEntry() { 1648e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban WriteFDEAddressRange(&cfi_info_, buffer_.Size(), false /* is_64bit */); 1649547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen PadCFI(&cfi_info_); 1650e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban WriteCFILength(&cfi_info_, false /* is_64bit */); 1651547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen} 1652547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1653790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 1654790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 16552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1656b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1657fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& entry_spills) { 1658547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_cfa_offset_ = kFramePointerSize; // Only return address on stack 1659547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_pc_ = buffer_.Size(); // Nothing emitted yet 1660547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DCHECK_EQ(cfi_pc_, 0U); 1661547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1662547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen uint32_t reg_offset = 1; 166306b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1664966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell int gpr_count = 0; 1665703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (int i = spill_regs.size() - 1; i >= 0; --i) { 1666966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell x86::X86ManagedRegister spill = spill_regs.at(i).AsX86(); 1667966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.IsCpuRegister()); 1668966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell pushl(spill.AsCpuRegister()); 1669966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell gpr_count++; 1670547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1671547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_advance_loc 1672547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_advance_loc(&cfi_info_, buffer_.Size() - cfi_pc_); 1673547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_pc_ = buffer_.Size(); 1674547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_def_cfa_offset 1675547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_cfa_offset_ += kFramePointerSize; 1676547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_def_cfa_offset(&cfi_info_, cfi_cfa_offset_); 1677547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_offset reg offset 1678547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen reg_offset++; 1679547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_offset(&cfi_info_, spill_regs.at(i).AsX86().DWARFRegId(), reg_offset); 1680703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1681547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1682b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // return address then method on stack 1683966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell int32_t adjust = frame_size - (gpr_count * kFramePointerSize) - 1684547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen sizeof(StackReference<mirror::ArtMethod>) /*method*/ - 1685547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen kFramePointerSize /*return address*/; 1686547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen addl(ESP, Immediate(-adjust)); 1687547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_advance_loc 1688547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_advance_loc(&cfi_info_, buffer_.Size() - cfi_pc_); 1689547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_pc_ = buffer_.Size(); 1690547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_def_cfa_offset 1691547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_cfa_offset_ += adjust; 1692547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_def_cfa_offset(&cfi_info_, cfi_cfa_offset_); 1693547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 16942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1695547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_advance_loc 1696547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_advance_loc(&cfi_info_, buffer_.Size() - cfi_pc_); 1697547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_pc_ = buffer_.Size(); 1698547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_def_cfa_offset 1699547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_cfa_offset_ += kFramePointerSize; 1700547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_def_cfa_offset(&cfi_info_, cfi_cfa_offset_); 1701547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen 1702b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1703966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell ManagedRegisterSpill spill = entry_spills.at(i); 1704966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.AsX86().IsCpuRegister()) { 1705966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movl(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsCpuRegister()); 1706966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1707966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.AsX86().IsXmmRegister()); 1708966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell if (spill.getSize() == 8) { 1709966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movsd(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1710966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } else { 1711966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell CHECK_EQ(spill.getSize(), 4); 1712966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell movss(Address(ESP, frame_size + spill.getSpillOffset()), spill.AsX86().AsXmmRegister()); 1713966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1714966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell } 1715b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1716b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1717b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::RemoveFrame(size_t frame_size, 17190d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers const std::vector<ManagedRegister>& spill_regs) { 172006b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1721cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe addl(ESP, Immediate(frame_size - (spill_regs.size() * kFramePointerSize) - 1722cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe sizeof(StackReference<mirror::ArtMethod>))); 1723703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (size_t i = 0; i < spill_regs.size(); ++i) { 1724966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell x86::X86ManagedRegister spill = spill_regs.at(i).AsX86(); 1725966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell DCHECK(spill.IsCpuRegister()); 1726966c3ae95d3c699ee9fbdbccc1acdaaf02325fafMark P Mendell popl(spill.AsCpuRegister()); 1727703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1728b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1729b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1730b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 173206b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1733b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1734547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_advance_loc 1735547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_advance_loc(&cfi_info_, buffer_.Size() - cfi_pc_); 1736547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_pc_ = buffer_.Size(); 1737547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen // DW_CFA_def_cfa_offset 1738547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen cfi_cfa_offset_ += adjust; 1739547cdfd21ee21e4ab9ca8692d6ef47c62ee7ea52Tong Shen DW_CFA_def_cfa_offset(&cfi_info_, cfi_cfa_offset_); 1740b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1741b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 174306b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1744b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1745b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1746b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 17482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 174945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 175045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 175145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 1752b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1753b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 17549b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 17559b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 17569b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 17579b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 17589b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 175945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 176045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 176145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 176245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 176345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 176445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 176545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 176645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 1767b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1768b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1769b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1770b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1771b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1772b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1773b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1774b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 17762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1777b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1778b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1779b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1780b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 17822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1783df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 1784df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1785df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 1786df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 17872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 17882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 17892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 17902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 17912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1792dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, 17932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 17942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 17952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 17962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1797dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, 17982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 17992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 18002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1801b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 18022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 18032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1804b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1805b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1806dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackPointerToThread32(ThreadOffset<4> thr_offs) { 18072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 1808b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1809b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 18101bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 18111bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 18122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 1813b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1814b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 18152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 18162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 181745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 181845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 181945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 1820b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1821b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 18229b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 18239b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 18249b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 18259b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 182645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 182745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 182845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 182945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 183045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 183145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1832b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 183345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 183445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 183545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 183645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 183745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 183845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1839b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1840b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1841b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1842dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadFromThread32(ManagedRegister mdest, ThreadOffset<4> src, size_t size) { 18435a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 18445a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 18455a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 18465a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 18475a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 18485a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 18495a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 18505a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 18515a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 1852dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset<4>(src.Int32Value()+4))); 18535a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 18545a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 18555a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 18565a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 18575a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 18585a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 18595a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 18605a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 18615a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 18625a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 18635a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 18645a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 18655a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 18665a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 18675a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 18685a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 18692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 18702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1871b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 1872b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 1873b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1874b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 18752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, 18762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers MemberOffset offs) { 18772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1878b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 18792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1880e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi if (kPoisonHeapReferences) { 1881e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi negl(dest.AsCpuRegister()); 1882e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi } 1883a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 1884a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 18852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 18862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 18872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1888a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 18892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1890b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1891b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1892dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadRawPtrFromThread32(ManagedRegister mdest, 1893dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> offs) { 18942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1895b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 18960d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 1897b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1898b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 189958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhaovoid X86Assembler::SignExtend(ManagedRegister mreg, size_t size) { 190058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao X86ManagedRegister reg = mreg.AsX86(); 190158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(size == 1 || size == 2) << size; 190258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(reg.IsCpuRegister()) << reg; 190358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao if (size == 1) { 190458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxb(reg.AsCpuRegister(), reg.AsByteRegister()); 190558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } else { 190658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 190758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } 190858136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao} 190958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 1910cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhaovoid X86Assembler::ZeroExtend(ManagedRegister mreg, size_t size) { 1911cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao X86ManagedRegister reg = mreg.AsX86(); 1912cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(size == 1 || size == 2) << size; 1913cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(reg.IsCpuRegister()) << reg; 1914cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao if (size == 1) { 1915cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxb(reg.AsCpuRegister(), reg.AsByteRegister()); 1916cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } else { 1917cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 1918cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } 1919cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao} 1920cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 1921b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 19222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 19232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 19242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 19252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 19262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 1927b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 1928b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 1929b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 1930b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 1931b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1932b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 1933b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 1934b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 1935b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1936b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 1937b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 1938b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1939b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 19402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 19412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 19422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 19432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 19442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 1945b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1946b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 19482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 19492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1950b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 19512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 19522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 1953b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1954b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1955dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrFromThread32(FrameOffset fr_offs, 1956dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> thr_offs, 19572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 19582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1959b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 19602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 19612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 196245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 196345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 1964dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrToThread32(ThreadOffset<4> thr_offs, 19652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 19662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 19672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 19682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 19692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 19702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1971b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1972b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 19742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 19752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 19762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1977b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 1978b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 1979b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 1980b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 1981b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 1982b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1983b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 1984b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 1985b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1986b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1987b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 19881bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 19891bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 1990dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 1991dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1992dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 19935a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 19945a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 19955a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 19965a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 19975a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 19985a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 19995a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 20005a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 2001dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 2002dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 2003dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2004dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 2005dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 2006dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 2007dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 2008dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2009dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 20105a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 20115a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 20125a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 20135a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 20145a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 20155a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 20165a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 20175a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 20185a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 20195a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 20205a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 2021dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 2022dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 20235a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 20245a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 20255a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 2026dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 2027dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 2028dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 2029e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 203079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 2031e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 2032e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 2033eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(ManagedRegister mout_reg, 2034eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 20352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 20362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 20372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2038b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2039b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2040408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 2041b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2042b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2043b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2044b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2045b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2046b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 204718c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2048eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2049b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2050b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2051eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(out_reg.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2052b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2053b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2054b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2055eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::CreateHandleScopeEntry(FrameOffset out_off, 2056eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier FrameOffset handle_scope_offset, 20572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 20582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 20592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2060b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 2061b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 2062b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2063eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier movl(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2064b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 206518c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2066eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2067b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2068b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 2069eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier leal(scratch.AsCpuRegister(), Address(ESP, handle_scope_offset)); 2070b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2071b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 2072b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2073b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 2074eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier// Given a handle scope entry, load the associated reference. 2075eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiervoid X86Assembler::LoadReferenceFromHandleScope(ManagedRegister mout_reg, 20762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 20772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 20782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 2079b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 2080b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 2081b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 2082b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 2083b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 2084b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 2085b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 208618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 2087b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 2088b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 2089b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2090b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20911bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 2092b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2093b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2094b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20951bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 2096b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 2097b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2098b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 20992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 21002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 2101b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 2102df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 2103b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 2104b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 2105b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 210667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 210767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 210867375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 210967375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 2110e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 2111e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 2112dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CallFromThread32(ThreadOffset<4> offset, ManagedRegister /*mscratch*/) { 2113bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 2114668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2115668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 21162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 21172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 2118dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers Address::Absolute(Thread::SelfOffset<4>())); 2119668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2120668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 21212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 21222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 21232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 2124dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset<4>())); 2125668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 2126668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 2127668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 212800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { 212900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers X86ExceptionSlowPath* slow = new X86ExceptionSlowPath(stack_adjust); 213045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 2131dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<4>()), Immediate(0)); 213218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 213345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 21340d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 21352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 21362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 21370d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 21380d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 213920cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 214000f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (stack_adjust_ != 0) { // Fix up the frame. 214100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers __ DecreaseFrameSize(stack_adjust_); 214200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 214367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 2144dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset<4>())); 2145dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->call(Address::Absolute(QUICK_ENTRYPOINT_OFFSET(4, pDeliverException))); 214667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 214767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 21480d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 214945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 215045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 21512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 2152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 2153