assembler_x86.cc revision b55f835d66a61e5da6fc1895ba5a0482868c9552
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers#include "assembler_x86.h" 182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 191aa246dec5abe212f699de1413a0c4a191ca364aElliott Hughes#include "base/casts.h" 20166db04e259ca51838c311891598664deeed85adIan Rogers#include "entrypoints/quick/quick_entrypoints.h" 21578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "memory_region.h" 22578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h" 23a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 246b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 { 26a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 27b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 28b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "XMM" << static_cast<int>(reg); 29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 30b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 31b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const X87Register& reg) { 32b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "ST" << static_cast<int>(reg); 33b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Register reg) { 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 38a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(2, reg); 39a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 40a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(const Address& address) { 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(2, address); 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 48a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Label* label) { 50a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE8); 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kSize = 5; 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabel(label, kSize); 54a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 578ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffrayvoid X86Assembler::call(const ExternalLabel& label) { 588ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray intptr_t call_start = buffer_.GetPosition(); 608ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitUint8(0xE8); 618ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray EmitInt32(label.address()); 628ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray static const intptr_t kCallExternalLabelSize = 5; 638ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray DCHECK_EQ((buffer_.GetPosition() - call_start), kCallExternalLabelSize); 648ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray} 658ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 668ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(Register reg) { 68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x50 + reg); 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Address& address) { 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(6, address); 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Immediate& imm) { 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 8244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers if (imm.is_int8()) { 8344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x6A); 8444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(imm.value() & 0xFF); 8544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } else { 8644fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x68); 8744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitImmediate(imm); 8844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers } 89a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(Register reg) { 93a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58 + reg); 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(const Address& address) { 99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8F); 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Immediate& imm) { 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB8 + dst); 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, Register src) { 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Address& src) { 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8B); 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, Register src) { 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, const Immediate& imm) { 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC7); 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, dst); 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 140bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::movl(const Address& dst, Label* lbl) { 141bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 142bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitUint8(0xC7); 143bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitOperand(0, dst); 144bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitLabel(lbl, dst.length_ + 5); 145bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers} 146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1791bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2321bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2452c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 255b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::setb(Condition condition, Register dst) { 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 263b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 264b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitOperand(0, Operand(dst)); 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5162c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 738a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7487caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::xchgl(Register reg, const Address& address) { 7497caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 7507caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0x87); 7517caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(reg, address); 7527caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 7537caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers 754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 763a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 765a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 766a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 767a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 769a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 781a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 848a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 866b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffrayvoid X86Assembler::xorl(Register dst, const Immediate& imm) { 867b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray AssemblerBuffer::EnsureCapacity ensured(&buffer_); 868b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray EmitComplex(6, Operand(dst), imm); 869b55f835d66a61e5da6fc1895ba5a0482868c9552Nicolas Geoffray} 870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 882a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 883a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 885a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 886a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 887a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 925a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 927a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x69); 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, Operand(reg)); 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 964a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 978a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1005a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10082c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1012a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1019a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, reg, imm); 1043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, operand, shifter); 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, reg, imm); 1053a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1054a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 1057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, operand, shifter); 1058a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, reg, imm); 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, operand, shifter); 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shld(Register dst, Register src) { 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11727caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogersvoid X86Assembler::jmp(const Address& address) { 11737caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 11747caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitUint8(0xFF); 11757caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers EmitOperand(4, address); 11767caad77632ae121c9f64c488e3f8f710e2c4813dIan Rogers} 1177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11992c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 12020d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 121379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 121479ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 121679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 121779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 121879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 121979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 12202c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1221b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1222b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1223b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 12240d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1225b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1227befbd5731ecca08f08780ee28a913d08ffb14656Ian RogersX86Assembler* X86Assembler::gs() { 1228befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers // TODO: fs is a prefix and not an instruction 1229befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1230befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers EmitUint8(0x65); 1231befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers return this; 1232befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers} 1233befbd5731ecca08f08780ee28a913d08ffb14656Ian Rogers 12342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(High32Bits(constant))); 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(Low32Bits(constant))); 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro movsd(dst, Address(ESP, 0)); 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(ESP, Immediate(2 * kWordSize)); 1260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::FloatNegate(XmmRegister f) { 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t a; 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t b; 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t c; 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t d; 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } float_negate_constant __attribute__((aligned(16))) = 1270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro { 0x80000000, 0x00000000, 0x80000000, 0x00000000 }; 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorps(f, Address::Absolute(reinterpret_cast<uword>(&float_negate_constant))); 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DoubleNegate(XmmRegister d) { 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_negate_constant __attribute__((aligned(16))) = 1280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x8000000000000000LL, 0x8000000000000000LL}; 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorpd(d, Address::Absolute(reinterpret_cast<uword>(&double_negate_constant))); 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DoubleAbs(XmmRegister reg) { 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_abs_constant __attribute__((aligned(16))) = 1290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}; 1291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro andpd(reg, Address::Absolute(reinterpret_cast<uword>(&double_abs_constant))); 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 131744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitOperand(int reg_or_opcode, const Operand& operand) { 131844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 131944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 132244fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers // Emit the ModRM byte updated with the given reg value. 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 132444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 133744fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitComplex(int reg_or_opcode, 13382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 13392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 134044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_GE(reg_or_opcode, 0); 134144fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers CHECK_LT(reg_or_opcode, 8); 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 134544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 134944fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitUint8(0x05 + (reg_or_opcode << 3)); 1350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 135344fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, operand); 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 137844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 13792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register reg, 13802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 138544fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(reg)); 1386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 138844fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(reg)); 1389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 139444fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogersvoid X86Assembler::EmitGenericShift(int reg_or_opcode, 13952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register operand, 13962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 140044fb0d0e096067e6bfe1dbfedf369e705bb10814Ian Rogers EmitOperand(reg_or_opcode, Operand(operand)); 1401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1403790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 1404790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 14052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1406b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1407fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& entry_spills) { 140806b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1409703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (int i = spill_regs.size() - 1; i >= 0; --i) { 1410703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao pushl(spill_regs.at(i).AsX86().AsCpuRegister()); 1411703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1412b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // return address then method on stack 1413790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers addl(ESP, Immediate(-frame_size + (spill_regs.size() * kFramePointerSize) + 1414790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers kFramePointerSize /*method*/ + kFramePointerSize /*return address*/)); 14152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1416b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1417790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers movl(Address(ESP, frame_size + kFramePointerSize + (i * kFramePointerSize)), 1418b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers entry_spills.at(i).AsX86().AsCpuRegister()); 1419b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1420b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1421b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::RemoveFrame(size_t frame_size, 14230d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers const std::vector<ManagedRegister>& spill_regs) { 142406b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 1425790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers addl(ESP, Immediate(frame_size - (spill_regs.size() * kFramePointerSize) - kFramePointerSize)); 1426703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao for (size_t i = 0; i < spill_regs.size(); ++i) { 1427703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao popl(spill_regs.at(i).AsX86().AsCpuRegister()); 1428703f2cd1f4d1eb5ab5c9792ca2de9ffb39378203jeffhao } 1429b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1430b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1431b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 143306b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1434b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1435b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1436b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 143806b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1439b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1440b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1441b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 14432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 144445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 144545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 144645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 1447b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1448b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 14499b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 14509b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 14519b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 14529b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 14539b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 145445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 145545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 145645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 145745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 145845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 145945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 146045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 146145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 1462b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1463b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1464b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1465b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1466b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1467b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1468b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1469b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 14712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1472b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1473b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1474b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1475b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 14772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1478df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 1479df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1480df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 1481df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 14822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 14832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 14842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 14852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 14862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1487dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreImmediateToThread32(ThreadOffset<4> dest, uint32_t imm, 14882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 14892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 14902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 14912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 1492dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackOffsetToThread32(ThreadOffset<4> thr_offs, 14932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 14942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 14952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1496b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 14972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 14982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1499b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1500b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1501dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::StoreStackPointerToThread32(ThreadOffset<4> thr_offs) { 15022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 1503b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1504b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15051bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 15061bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 15072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 1508b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1509b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 15112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 151245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 151345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 151445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 1515b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1516b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 15179b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 15189b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 15199b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 15209b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 152145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 152245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 152345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 152445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 152545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 152645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1527b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 152845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 152945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 153045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 153145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 153245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 153345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1534b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1535b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1536b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1537dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadFromThread32(ManagedRegister mdest, ThreadOffset<4> src, size_t size) { 15385a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 15395a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 15405a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 15415a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 15425a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 15435a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 15445a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 15455a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 15465a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 1547dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset<4>(src.Int32Value()+4))); 15485a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 15495a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 15505a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 15515a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15525a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 15535a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15545a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15555a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 15565a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 15575a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 15585a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15595a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 15605a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15615a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15625a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 15635a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 15642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 15652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1566b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 1567b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 1568b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1569b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, 15712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers MemberOffset offs) { 15722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1573b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 15742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1575e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi if (kPoisonHeapReferences) { 1576e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi negl(dest.AsCpuRegister()); 1577e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi } 1578a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 1579a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 15802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 15812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 15822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1583a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 15842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1585b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1586b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1587dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::LoadRawPtrFromThread32(ManagedRegister mdest, 1588dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> offs) { 15892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1590b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 15910d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 1592b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1593b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 159458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhaovoid X86Assembler::SignExtend(ManagedRegister mreg, size_t size) { 159558136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao X86ManagedRegister reg = mreg.AsX86(); 159658136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(size == 1 || size == 2) << size; 159758136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao CHECK(reg.IsCpuRegister()) << reg; 159858136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao if (size == 1) { 159958136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxb(reg.AsCpuRegister(), reg.AsByteRegister()); 160058136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } else { 160158136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao movsxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 160258136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao } 160358136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao} 160458136caeec7cb677bb83c2eafd1f4bab5afd96c8jeffhao 1605cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhaovoid X86Assembler::ZeroExtend(ManagedRegister mreg, size_t size) { 1606cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao X86ManagedRegister reg = mreg.AsX86(); 1607cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(size == 1 || size == 2) << size; 1608cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao CHECK(reg.IsCpuRegister()) << reg; 1609cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao if (size == 1) { 1610cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxb(reg.AsCpuRegister(), reg.AsByteRegister()); 1611cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } else { 1612cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao movzxw(reg.AsCpuRegister(), reg.AsCpuRegister()); 1613cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao } 1614cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao} 1615cee4d0c1c2faacf0eae748a24cc7e455e067d977jeffhao 1616b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 16172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 16182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 16192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 16202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 16212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 1622b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 1623b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 1624b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 1625b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 1626b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1627b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 1628b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 1629b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 1630b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1631b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 1632b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 1633b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1634b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 16352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 16362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 16372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 16382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 16392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 1640b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1641b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 16432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1645b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 16462c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 16472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 1648b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1649b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1650dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrFromThread32(FrameOffset fr_offs, 1651dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers ThreadOffset<4> thr_offs, 16522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1654b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 16552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 16562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 165745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 165845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 1659dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CopyRawPtrToThread32(ThreadOffset<4> thr_offs, 16602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 16612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 16632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 16642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 16652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1666b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1667b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 16692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 16702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 16712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1672b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 1673b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 1674b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 1675b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 1676b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 1677b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1678b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 1679b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 1680b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1681b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1682b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16831bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 16841bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 1685dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 1686dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1687dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 16885a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 16895a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 16905a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 16915a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 16925a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 16935a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 16945a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 16955a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 1696dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 1697dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 1698dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 1699dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 1700dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 1701dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 1702dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 1703dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1704dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 17055a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 17065a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 17075a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 17085a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 17095a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 17105a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 17115a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 17125a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 17135a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 17145a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 17155a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 1716dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 1717dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 17185a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 17195a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 17205a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 1721dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 1722dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1723dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 1724e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 1725e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers#if ANDROID_SMP != 0 172679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 1727e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers#endif 1728e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 1729e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 17302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CreateSirtEntry(ManagedRegister mout_reg, 17312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset sirt_offset, 17322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 17332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 17342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 1735b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1736b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1737408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 1738b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1739b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1740b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1741b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1742b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1743b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 174418c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1745408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(out_reg.AsCpuRegister(), Address(ESP, sirt_offset)); 1746b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1747b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1748408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(out_reg.AsCpuRegister(), Address(ESP, sirt_offset)); 1749b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1750b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1751b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CreateSirtEntry(FrameOffset out_off, 17532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset sirt_offset, 17542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 17552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 17562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1757b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1758b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1759b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1760408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers movl(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1761b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 176218c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1763408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1764b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1765b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1766408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1767b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1768b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 1769b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1770b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1771408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers// Given a SIRT entry, load the associated reference. 17722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadReferenceFromSirt(ManagedRegister mout_reg, 17732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 17742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 17752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 1776b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1777b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1778b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1779b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1780b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1781b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1782b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 178318c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1784b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 1785b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1786b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1787b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17881bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 1789b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1790b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1791b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17921bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 1793b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1794b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1795b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 17972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 1798b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 1799df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 1800b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 1801b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1802b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 180367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 180467375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 180567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 180667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 1807e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 1808e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 1809dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogersvoid X86Assembler::CallFromThread32(ThreadOffset<4> offset, ManagedRegister /*mscratch*/) { 1810bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 1811668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1812668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 18132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 18142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 1815dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers Address::Absolute(Thread::SelfOffset<4>())); 1816668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1817668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 18182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 18192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 18202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1821dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset<4>())); 1822668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 1823668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1824668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 182500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogersvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { 182600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers X86ExceptionSlowPath* slow = new X86ExceptionSlowPath(stack_adjust); 182745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 1828dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<4>()), Immediate(0)); 182918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 183045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 18310d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 18322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 18332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 18340d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 18350d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 183620cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 183700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (stack_adjust_ != 0) { // Fix up the frame. 183800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers __ DecreaseFrameSize(stack_adjust_); 183900f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers } 184067375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 1841dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset<4>())); 1842dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers __ fs()->call(Address::Absolute(QUICK_ENTRYPOINT_OFFSET(4, pDeliverException))); 184367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 184467375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 18450d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 184645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 184745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 18482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 1849b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 1850