assembler_x86.cc revision 1bac54ffa933fbe9b92b62437577f2f4583eff1a
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 19578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "casts.h" 20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "memory_region.h" 21578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h" 22a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 236b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersnamespace x86 { 25a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 26a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass DirectCallRelocation : public AssemblerFixup { 27a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 28a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void Process(const MemoryRegion& region, int position) { 29a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Direct calls are relative to the following instruction on x86. 30a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t pointer = region.Load<int32_t>(position); 31a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t start = reinterpret_cast<int32_t>(region.start()); 32a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t delta = start + position + sizeof(int32_t); 33a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro region.Store<int32_t>(position, pointer - delta); 34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 35a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 371f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughesstatic const char* kRegisterNames[] = { 381f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", 391f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes}; 401f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughesstd::ostream& operator<<(std::ostream& os, const Register& rhs) { 411f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes if (rhs >= EAX && rhs <= EDI) { 421f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes os << kRegisterNames[rhs]; 431f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } else { 44b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "Register[" << static_cast<int>(rhs) << "]"; 451f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } 461f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes return os; 471f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes} 481f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes 49b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 50b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "XMM" << static_cast<int>(reg); 51b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 52b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 53b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const X87Register& reg) { 54b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "ST" << static_cast<int>(reg); 55b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Register reg) { 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 59a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 60a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(2, reg); 61a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 62a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(const Address& address) { 65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(2, address); 68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::call(Label* label) { 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE8); 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kSize = 5; 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabel(label, kSize); 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(Register reg) { 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x50 + reg); 82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Address& address) { 86a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 87a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 88a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(6, address); 89a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::pushl(const Immediate& imm) { 93a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x68); 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(Register reg) { 100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58 + reg); 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::popl(const Address& address) { 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8F); 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Immediate& imm) { 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB8 + dst); 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, Register src) { 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(Register dst, const Address& src) { 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8B); 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, Register src) { 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movl(const Address& dst, const Immediate& imm) { 141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC7); 143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, dst); 144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 147bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::movl(const Address& dst, Label* lbl) { 148bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 149bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitUint8(0xC7); 150bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitOperand(0, dst); 151bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers EmitLabel(lbl, dst.length_ + 5); 152bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers} 153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1542c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, ByteRegister src) { 155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxb(Register dst, const Address& src) { 163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, ByteRegister src) { 171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxb(Register dst, const Address& src) { 179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1861bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movb(Register /*dst*/, const Address& /*src*/) { 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1912c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, ByteRegister src) { 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movb(const Address& dst, const Immediate& imm) { 199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, Register src) { 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movzxw(Register dst, const Address& src) { 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, Register src) { 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsxw(Register dst, const Address& src) { 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2391bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::movw(Register /*dst*/, const Address& /*src*/) { 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2442c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movw(const Address& dst, Register src) { 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2522c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leal(Register dst, const Address& src) { 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmovl(Condition condition, Register dst, Register src) { 260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 262b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2672c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::setb(Condition condition, Register dst) { 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 270b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 271b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitOperand(0, Operand(dst)); 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, const Address& src) { 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(const Address& dst, XmmRegister src) { 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 2932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movss(XmmRegister dst, XmmRegister src) { 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(XmmRegister dst, Register src) { 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movd(Register dst, XmmRegister src) { 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, XmmRegister src) { 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addss(XmmRegister dst, const Address& src) { 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, XmmRegister src) { 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subss(XmmRegister dst, const Address& src) { 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, XmmRegister src) { 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulss(XmmRegister dst, const Address& src) { 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, XmmRegister src) { 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divss(XmmRegister dst, const Address& src) { 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::flds(const Address& src) { 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstps(const Address& dst) { 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, const Address& src) { 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4152c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(const Address& dst, XmmRegister src) { 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4242c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::movsd(XmmRegister dst, XmmRegister src) { 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, XmmRegister src) { 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addsd(XmmRegister dst, const Address& src) { 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4512c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, XmmRegister src) { 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subsd(XmmRegister dst, const Address& src) { 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, XmmRegister src) { 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mulsd(XmmRegister dst, const Address& src) { 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, XmmRegister src) { 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 4962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::divsd(XmmRegister dst, const Address& src) { 497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2ss(XmmRegister dst, Register src) { 506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsi2sd(XmmRegister dst, Register src) { 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2si(Register dst, XmmRegister src) { 524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 525a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2si(Register dst, XmmRegister src) { 542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5502c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttss2si(Register dst, XmmRegister src) { 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvttsd2si(Register dst, XmmRegister src) { 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comiss(XmmRegister a, XmmRegister b) { 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 5942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::comisd(XmmRegister a, XmmRegister b) { 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, const Address& src) { 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorpd(XmmRegister dst, XmmRegister src) { 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, const Address& src) { 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6472c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorps(XmmRegister dst, XmmRegister src) { 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andpd(XmmRegister dst, const Address& src) { 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldl(const Address& src) { 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fstpl(const Address& dst) { 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fnstcw(const Address& dst) { 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fldcw(const Address& src) { 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistpl(const Address& dst) { 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fistps(const Address& dst) { 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fildl(const Address& src) { 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fincstp() { 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ffree(const Immediate& index) { 721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fsin() { 729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fcos() { 736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 738a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::fptan() { 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7492c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xchgl(Register dst, Register src) { 750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Immediate& imm) { 757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg0, Register reg1) { 763a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 765a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 766a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 767a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 768a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(Register reg, const Address& address) { 770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register dst, Register src) { 777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 781a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Address& address) { 784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, Register reg) { 791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 7972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpl(const Address& address, const Immediate& imm) { 798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg1, Register reg2) { 804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::testl(Register reg, const Immediate& immediate) { 811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, Register src) { 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::andl(Register dst, const Immediate& imm) { 843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, Register src) { 849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8552c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::orl(Register dst, const Immediate& imm) { 856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8612c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::xorl(Register dst, Register src) { 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(Register reg, const Immediate& imm) { 869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 871a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, Register reg) { 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::addl(const Address& address, const Immediate& imm) { 882a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 883a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 884a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 885a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 886a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register reg, const Immediate& imm) { 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 8932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, Register src) { 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::adcl(Register dst, const Address& address) { 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9072c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register dst, Register src) { 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Immediate& imm) { 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::subl(Register reg, const Address& address) { 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 925a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cdq() { 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::idivl(Register reg) { 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register dst, Register src) { 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 943a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Immediate& imm) { 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x69); 951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, Operand(reg)); 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg, const Address& address) { 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(Register reg) { 965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::imull(const Address& address) { 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(Register reg) { 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::mull(const Address& address) { 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9922c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, Register src) { 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 9992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register reg, const Immediate& imm) { 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sbbl(Register dst, const Address& address) { 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(Register reg) { 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 1015a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::incl(const Address& address) { 1019a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(Register reg) { 1026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::decl(const Address& address) { 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register reg, const Immediate& imm) { 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, reg, imm); 1040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10432c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shll(Register operand, Register shifter) { 1044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, operand, shifter); 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1046a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register reg, const Immediate& imm) { 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, reg, imm); 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shrl(Register operand, Register shifter) { 1054a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, operand, shifter); 1055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1056a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register reg, const Immediate& imm) { 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, reg, imm); 1060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::sarl(Register operand, Register shifter) { 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, operand, shifter); 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10682c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::shld(Register dst, Register src) { 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::negl(Register reg) { 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::notl(Register reg) { 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::enter(const Immediate& imm) { 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::leave() { 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret() { 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::ret(const Immediate& imm) { 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::nop() { 1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::int3() { 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11342c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::hlt() { 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::j(Condition condition, Label* label) { 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Register reg) { 1164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::jmp(Label* label) { 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11912c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::lock() { 1192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 11940d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::cmpxchgl(const Address& address, Register reg) { 1199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 120579ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughesvoid X86Assembler::mfence() { 120679ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes AssemblerBuffer::EnsureCapacity ensured(&buffer_); 120779ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0x0F); 120879ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xAE); 120979ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes EmitUint8(0xF0); 121079ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes} 121179ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes 12122c8f653c98d658419f464b6147c10e11a664d2e6Ian RogersX86Assembler* X86Assembler::fs() { 1213b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1214b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1215b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 12160d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers return this; 1217b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::AddImmediate(Register reg, const Immediate& imm) { 1220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(High32Bits(constant))); 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(Low32Bits(constant))); 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro movsd(dst, Address(ESP, 0)); 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(ESP, Immediate(2 * kWordSize)); 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12482c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::FloatNegate(XmmRegister f) { 1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t a; 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t b; 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t c; 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t d; 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } float_negate_constant __attribute__((aligned(16))) = 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro { 0x80000000, 0x00000000, 0x80000000, 0x00000000 }; 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorps(f, Address::Absolute(reinterpret_cast<uword>(&float_negate_constant))); 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12602c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DoubleNegate(XmmRegister d) { 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_negate_constant __attribute__((aligned(16))) = 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x8000000000000000LL, 0x8000000000000000LL}; 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorpd(d, Address::Absolute(reinterpret_cast<uword>(&double_negate_constant))); 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DoubleAbs(XmmRegister reg) { 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_abs_constant __attribute__((aligned(16))) = 1275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}; 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro andpd(reg, Address::Absolute(reinterpret_cast<uword>(&double_abs_constant))); 1277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Align(int alignment, int offset) { 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 12892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Bind(Label* label) { 1290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Stop(const char* message) { 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the message address as immediate operand in the test rax instruction, 1304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // followed by the int3 instruction. 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Execution can be resumed with the 'cont' command in gdb. 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro testl(EAX, Immediate(reinterpret_cast<int32_t>(message))); 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int3(); 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitOperand(int rm, const Operand& operand) { 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the ModRM byte updated with the given RM value. 1317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 1318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[0] + (rm << 3)); 1319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitImmediate(const Immediate& imm) { 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitComplex(int rm, 13322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Operand& operand, 13332c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& immediate) { 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 1339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, operand); 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x05 + (rm << 3)); 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, operand); 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13532c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabel(Label* label, int instruction_size) { 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitLabelLink(Label* label) { 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitGenericShift(int rm, 13732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register reg, 13742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers const Immediate& imm) { 1375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 1379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(reg)); 1380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 1382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(reg)); 1383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::EmitGenericShift(int rm, 13892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register operand, 13902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Register shifter) { 1391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 1394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(operand)); 1395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 13972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg, 1398b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& spill_regs, 1399b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers const std::vector<ManagedRegister>& entry_spills) { 140006b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 14010d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers CHECK_EQ(0u, spill_regs.size()); // no spilled regs on x86 1402b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // return address then method on stack 14030d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers addl(ESP, Immediate(-frame_size + kPointerSize /*method*/ + 14040d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers kPointerSize /*return address*/)); 14052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers pushl(method_reg.AsX86().AsCpuRegister()); 1406b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers for (size_t i = 0; i < entry_spills.size(); ++i) { 1407b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movl(Address(ESP, frame_size + kPointerSize + (i * kPointerSize)), 1408b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers entry_spills.at(i).AsX86().AsCpuRegister()); 1409b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1410b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1411b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14122c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::RemoveFrame(size_t frame_size, 14130d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers const std::vector<ManagedRegister>& spill_regs) { 141406b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(frame_size, kStackAlignment); 14150d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers CHECK_EQ(0u, spill_regs.size()); // no spilled regs on x86 14160d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers addl(ESP, Immediate(frame_size - kPointerSize)); 1417b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1418b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1419b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::IncreaseFrameSize(size_t adjust) { 142106b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1422b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1423b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1424b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14252c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::DecreaseFrameSize(size_t adjust) { 142606b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes CHECK_ALIGNED(adjust, kStackAlignment); 1427b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1428b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1429b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Store(FrameOffset offs, ManagedRegister msrc, size_t size) { 14312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 143245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (src.IsNoRegister()) { 143345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 143445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsCpuRegister()) { 1435b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1436b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 14379b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (src.IsRegisterPair()) { 14389b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 14399b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, offs), src.AsRegisterPairLow()); 14409b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(Address(ESP, FrameOffset(offs.Int32Value()+4)), 14419b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers src.AsRegisterPairHigh()); 144245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (src.IsX87Register()) { 144345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 144445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstps(Address(ESP, offs)); 144545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 144645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fstpl(Address(ESP, offs)); 144745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 144845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 144945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(src.IsXmmRegister()); 1450b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1451b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1452b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1453b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1454b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1455b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1456b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1457b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14582c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRef(FrameOffset dest, ManagedRegister msrc) { 14592c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1460b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1461b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1462b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1463b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreRawPtr(FrameOffset dest, ManagedRegister msrc) { 14652c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 1466df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers CHECK(src.IsCpuRegister()); 1467df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1468df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers} 1469df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers 14702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 14712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 14722c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 14732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 14742c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 14752c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreImmediateToThread(ThreadOffset dest, uint32_t imm, 14762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister) { 14772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(dest), Immediate(imm)); 14782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} 14792c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers 14802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreStackOffsetToThread(ThreadOffset thr_offs, 14812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 14822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 14832c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1484b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 14852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 14862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1487b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1488b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 14892c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::StoreStackPointerToThread(ThreadOffset thr_offs) { 14902c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), ESP); 1491b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1492b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1493bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogersvoid X86Assembler::StoreLabelToThread(ThreadOffset thr_offs, Label* lbl) { 1494bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->movl(Address::Absolute(thr_offs), lbl); 1495bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers} 1496bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers 14971bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::StoreSpanning(FrameOffset /*dst*/, ManagedRegister /*src*/, 14981bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes FrameOffset /*in_off*/, ManagedRegister /*scratch*/) { 14992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL); // this case only currently exists for ARM 1500b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1501b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Load(ManagedRegister mdest, FrameOffset src, size_t size) { 15032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 150445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (dest.IsNoRegister()) { 150545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK_EQ(0u, size); 150645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsCpuRegister()) { 1507b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1508b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 15099b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers } else if (dest.IsRegisterPair()) { 15109b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers CHECK_EQ(8u, size); 15119b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairLow(), Address(ESP, src)); 15129b269d281d16798b0c24027c32ec6507f71b2787Ian Rogers movl(dest.AsRegisterPairHigh(), Address(ESP, FrameOffset(src.Int32Value()+4))); 151345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else if (dest.IsX87Register()) { 151445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 151545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers flds(Address(ESP, src)); 151645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 151745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers fldl(Address(ESP, src)); 151845a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1519b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 152045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers CHECK(dest.IsXmmRegister()); 152145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers if (size == 4) { 152245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, src)); 152345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } else { 152445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, src)); 152545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers } 1526b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1527b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1528b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15295a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Load(ManagedRegister mdest, ThreadOffset src, size_t size) { 15305a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers X86ManagedRegister dest = mdest.AsX86(); 15315a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (dest.IsNoRegister()) { 15325a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(0u, size); 15335a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsCpuRegister()) { 15345a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(4u, size); 15355a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(src)); 15365a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsRegisterPair()) { 15375a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(8u, size); 15385a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairLow(), Address::Absolute(src)); 15395a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movl(dest.AsRegisterPairHigh(), Address::Absolute(ThreadOffset(src.Int32Value()+4))); 15405a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else if (dest.IsX87Register()) { 15415a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 15425a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->flds(Address::Absolute(src)); 15435a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15445a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->fldl(Address::Absolute(src)); 15455a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15465a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15475a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(dest.IsXmmRegister()); 15485a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers if (size == 4) { 15495a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movss(dest.AsXmmRegister(), Address::Absolute(src)); 15505a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } else { 15515a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers fs()->movsd(dest.AsXmmRegister(), Address::Absolute(src)); 15525a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15535a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers } 15545a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 15555a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 15562c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, FrameOffset src) { 15572c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1558b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 1559b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 1560b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1561b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15622c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base, 15632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers MemberOffset offs) { 15642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1565b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 15662c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1567a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers} 1568a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers 15692c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base, 15702c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Offset offs) { 15712c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1572a04d397b990ee7d3ce120e317c19fb4409d80d57Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 15732c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs)); 1574b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1575b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 15762c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadRawPtrFromThread(ManagedRegister mdest, 15772c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ThreadOffset offs) { 15782c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 1579b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 15800d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->movl(dest.AsCpuRegister(), Address::Absolute(offs)); 1581b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1582b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1583b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogersvoid X86Assembler::Move(ManagedRegister mdest, ManagedRegister msrc, size_t size) { 15842c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister dest = mdest.AsX86(); 15852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister src = msrc.AsX86(); 15862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (!dest.Equals(src)) { 15872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 15882c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 1589b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else if (src.IsX87Register() && dest.IsXmmRegister()) { 1590b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers // Pass via stack and pop X87 register 1591b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers subl(ESP, Immediate(16)); 1592b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers if (size == 4) { 1593b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1594b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstps(Address(ESP, 0)); 1595b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movss(dest.AsXmmRegister(), Address(ESP, 0)); 1596b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } else { 1597b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers CHECK_EQ(src.AsX87Register(), ST0); 1598b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers fstpl(Address(ESP, 0)); 1599b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers movsd(dest.AsXmmRegister(), Address(ESP, 0)); 1600b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers } 1601b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers addl(ESP, Immediate(16)); 16022c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } else { 16032c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers // TODO: x87, SSE 16042c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers UNIMPLEMENTED(FATAL) << ": Move " << dest << ", " << src; 16052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 16062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers } 1607b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1608b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16092c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRef(FrameOffset dest, FrameOffset src, 16102c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16112c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1612b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 16132c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 16142c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 1615b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1616b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16172c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRawPtrFromThread(FrameOffset fr_offs, 16182c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ThreadOffset thr_offs, 16192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1621b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 16222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 16232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Store(fr_offs, scratch, 4); 162445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 162545a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 16262c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CopyRawPtrToThread(ThreadOffset thr_offs, 16272c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset fr_offs, 16282c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 16292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 16302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers CHECK(scratch.IsCpuRegister()); 16312c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Load(scratch, fr_offs, 4); 16322c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1633b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1634b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16352c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src, 16362c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 16372c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t size) { 16382c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1639b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 1640b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 1641b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 1642b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 1643b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 1644b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1645b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 1646b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 1647b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1648b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1649b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 16501bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Copy(FrameOffset /*dst*/, ManagedRegister /*src_base*/, Offset /*src_offset*/, 16511bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughes ManagedRegister /*scratch*/, size_t /*size*/) { 1652dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers UNIMPLEMENTED(FATAL); 1653dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1654dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 16555a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest_base, Offset dest_offset, FrameOffset src, 16565a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 16575a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 16585a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 16595a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(ESP, src)); 16605a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest_base.AsX86().AsCpuRegister(), dest_offset)); 16615a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 16625a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 1663dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogersvoid X86Assembler::Copy(FrameOffset dest, FrameOffset src_base, Offset src_offset, 1664dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers ManagedRegister mscratch, size_t size) { 1665dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 1666dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 1667dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(ESP, src_base)); 1668dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(scratch, Address(scratch, src_offset)); 1669dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers movl(Address(ESP, dest), scratch); 1670dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1671dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 16725a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(ManagedRegister dest, Offset dest_offset, 16735a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister src, Offset src_offset, 16745a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister scratch, size_t size) { 16755a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(size, 4u); 16765a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK(scratch.IsNoRegister()); 16775a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(src.AsX86().AsCpuRegister(), src_offset)); 16785a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers popl(Address(dest.AsX86().AsCpuRegister(), dest_offset)); 16795a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers} 16805a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers 16815a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogersvoid X86Assembler::Copy(FrameOffset dest, Offset dest_offset, FrameOffset src, Offset src_offset, 16825a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers ManagedRegister mscratch, size_t size) { 1683dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 1684dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers CHECK_EQ(size, 4u); 16855a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers CHECK_EQ(dest.Int32Value(), src.Int32Value()); 16865a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers movl(scratch, Address(ESP, src)); 16875a7a74a042e73a355f5cedffa0d2faf5340028faIan Rogers pushl(Address(scratch, src_offset)); 1688dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers popl(Address(scratch, dest_offset)); 1689dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers} 1690dc51b79e65abcdad094ccd5e5a2caf5153433d49Ian Rogers 1691e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogersvoid X86Assembler::MemoryBarrier(ManagedRegister) { 1692e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers#if ANDROID_SMP != 0 169379ab9e32c6880e7b342c192a479c858c9dccf496Elliott Hughes mfence(); 1694e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers#endif 1695e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers} 1696e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers 16972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CreateSirtEntry(ManagedRegister mout_reg, 16982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset sirt_offset, 16992c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg, bool null_allowed) { 17002c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 17012c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 1702b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1703b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1704408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers VerifyObject(in_reg, null_allowed); 1705b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1706b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1707b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1708b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1709b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1710b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 171118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1712408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(out_reg.AsCpuRegister(), Address(ESP, sirt_offset)); 1713b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1714b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1715408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(out_reg.AsCpuRegister(), Address(ESP, sirt_offset)); 1716b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1717b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1718b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17192c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::CreateSirtEntry(FrameOffset out_off, 17202c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset sirt_offset, 17212c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch, 17222c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers bool null_allowed) { 17232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1724b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1725b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1726b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1727408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers movl(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1728b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 172918c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1730408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1731b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1732b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1733408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers leal(scratch.AsCpuRegister(), Address(ESP, sirt_offset)); 1734b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1735b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 1736b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1737b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1738408f79aeb676251ba35667a64e86c20638d7cb0bIan Rogers// Given a SIRT entry, load the associated reference. 17392c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::LoadReferenceFromSirt(ManagedRegister mout_reg, 17402c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister min_reg) { 17412c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister out_reg = mout_reg.AsX86(); 17422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister in_reg = min_reg.AsX86(); 1743b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1744b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1745b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1746b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1747b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1748b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1749b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 175018c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kZero, &null_arg); 1751b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 1752b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1753b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1754b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17551bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(ManagedRegister /*src*/, bool /*could_be_null*/) { 1756b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1757b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1758b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17591bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::VerifyObject(FrameOffset /*src*/, bool /*could_be_null*/) { 1760b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1761b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1762b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 17632c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::Call(ManagedRegister mbase, Offset offset, ManagedRegister) { 17642c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister base = mbase.AsX86(); 1765b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 1766df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers call(Address(base.AsCpuRegister(), offset.Int32Value())); 1767b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 1768b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1769b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 177067375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogersvoid X86Assembler::Call(FrameOffset base, Offset offset, ManagedRegister mscratch) { 177167375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers Register scratch = mscratch.AsX86().AsCpuRegister(); 177267375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers movl(scratch, Address(ESP, base)); 177367375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers call(Address(scratch, offset)); 1774e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro} 1775e2d373e6e09c1df9a47e73a26254048adb31ce82Carl Shapiro 17761bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::Call(ThreadOffset offset, ManagedRegister /*mscratch*/) { 1777bdb0391258abc54bf77c676e36847d28a783bfe5Ian Rogers fs()->call(Address::Absolute(offset)); 1778668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1779668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 17802c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(ManagedRegister tr) { 17812c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers fs()->movl(tr.AsX86().AsCpuRegister(), 17822c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers Address::Absolute(Thread::SelfOffset())); 1783668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1784668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 17852c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86Assembler::GetCurrentThread(FrameOffset offset, 17862c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister mscratch) { 17872c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ManagedRegister scratch = mscratch.AsX86(); 1788668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao fs()->movl(scratch.AsCpuRegister(), Address::Absolute(Thread::SelfOffset())); 1789668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao movl(Address(ESP, offset), scratch.AsCpuRegister()); 1790668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao} 1791668512afd0d9b3772a0abc589208b729ee16bc61Shih-wei Liao 17921bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::SuspendPoll(ManagedRegister /*scratch*/, 17932c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers ManagedRegister return_reg, 17942c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers FrameOffset return_save_location, 17952c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers size_t return_size) { 17962c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86SuspendCountSlowPath* slow = 17972c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers new X86SuspendCountSlowPath(return_reg.AsX86(), return_save_location, 17982c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers return_size); 179945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 18000d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->cmpl(Address::Absolute(Thread::SuspendCountOffset()), Immediate(0)); 180118c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 180245a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers Bind(slow->Continuation()); 180345a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 18040d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 18052c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86SuspendCountSlowPath::Emit(Assembler *sasm) { 18062c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 18070d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 18080d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 180945a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers // Save return value 18100d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Store(return_save_location_, return_register_, return_size_); 1811e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers // Pass Thread::Current as argument 1812e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers __ fs()->pushl(Address::Absolute(Thread::SelfOffset())); 1813e5de95b3f9609e02fefd7cda7b21f30c9412eb4cIan Rogers __ fs()->call(Address::Absolute(OFFSETOF_MEMBER(Thread, pCheckSuspendFromCode))); 181445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers // Release argument 18150d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ addl(ESP, Immediate(kPointerSize)); 181645a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers // Reload return value 18170d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Load(return_register_, return_save_location_, return_size_); 18180d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ jmp(&continuation_); 18190d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 182045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 182145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 18221bac54ffa933fbe9b92b62437577f2f4583eff1aElliott Hughesvoid X86Assembler::ExceptionPoll(ManagedRegister /*scratch*/) { 18232c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86ExceptionSlowPath* slow = new X86ExceptionSlowPath(); 182445a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers buffer_.EnqueueSlowPath(slow); 18250d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers fs()->cmpl(Address::Absolute(Thread::ExceptionOffset()), Immediate(0)); 182618c0753c1659629021b4becdaa3f6ea81aecce35Elliott Hughes j(kNotEqual, slow->Entry()); 182745a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 18280d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers 18292c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogersvoid X86ExceptionSlowPath::Emit(Assembler *sasm) { 18302c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers X86Assembler* sp_asm = down_cast<X86Assembler*>(sasm); 18310d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#define __ sp_asm-> 18320d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers __ Bind(&entry_); 183320cde9033d51103f31e21436e88f80e1170c78adElliott Hughes // Note: the return value is dead 183467375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // Pass exception as argument in EAX 183567375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ fs()->movl(EAX, Address::Absolute(Thread::ExceptionOffset())); 183667375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ fs()->call(Address::Absolute(OFFSETOF_MEMBER(Thread, pDeliverException))); 183767375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers // this call should never return 183867375acd9fec74cc2054554fe1ed0a7d213e1e47Ian Rogers __ int3(); 18390d666d8769714dcbc2acc4dd5b06f0deffa6e0a1Ian Rogers#undef __ 184045a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers} 184145a76cb99104a222d6a9bd768a084893dcb7cf30Ian Rogers 18422c8f653c98d658419f464b6147c10e11a664d2e6Ian Rogers} // namespace x86 1843b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 1844