assembler_x86.cc revision b033c75ebda80ac75f936366fe78d1edf5cec937
1a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro// Copyright 2011 Google Inc. All Rights Reserved. 2a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include <string.h> 4a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include "src/assembler.h" 5a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include "src/casts.h" 6a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include "src/globals.h" 7a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include "src/memory_region.h" 8a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 96b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 10a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 11a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiroclass DirectCallRelocation : public AssemblerFixup { 12a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro public: 13a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro void Process(const MemoryRegion& region, int position) { 14a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Direct calls are relative to the following instruction on x86. 15a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t pointer = region.Load<int32_t>(position); 16a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t start = reinterpret_cast<int32_t>(region.start()); 17a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int32_t delta = start + position + sizeof(int32_t); 18a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro region.Store<int32_t>(position, pointer - delta); 19a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 20a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro}; 21a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 221f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughesstatic const char* kRegisterNames[] = { 231f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", 241f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes}; 251f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughesstd::ostream& operator<<(std::ostream& os, const Register& rhs) { 261f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes if (rhs >= EAX && rhs <= EDI) { 271f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes os << kRegisterNames[rhs]; 281f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } else { 29b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers os << "Register[" << static_cast<int>(rhs) << "]"; 301f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } 311f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes return os; 321f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes} 331f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes 34b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 35b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "XMM" << static_cast<int>(reg); 36b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 37b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 38b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstd::ostream& operator<<(std::ostream& os, const X87Register& reg) { 39b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers return os << "ST" << static_cast<int>(reg); 40b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 42a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::InitializeMemoryWithBreakpoints(byte* data, size_t length) { 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro memset(reinterpret_cast<void*>(data), Instr::kBreakPointInstruction, length); 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 45a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 46a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 47a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::call(Register reg) { 48a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 49a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 50a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(2, reg); 51a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 52a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 54a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::call(const Address& address) { 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(2, address); 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 59a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 60a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 61a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::call(Label* label) { 62a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 63a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE8); 64a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kSize = 5; 65a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabel(label, kSize); 66a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 67a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 68a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 69a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::pushl(Register reg) { 70a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 71a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x50 + reg); 72a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 73a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::pushl(const Address& address) { 76a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 78a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(6, address); 79a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 80a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 81a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 82a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::pushl(const Immediate& imm) { 83a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 84a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x68); 85a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 86a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 87a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 88a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 89a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::popl(Register reg) { 90a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 91a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58 + reg); 92a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 93a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 94a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 95a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::popl(const Address& address) { 96a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 97a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8F); 98a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 99a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movl(Register dst, const Immediate& imm) { 103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB8 + dst); 105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movl(Register dst, Register src) { 110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movl(Register dst, const Address& src) { 117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8B); 119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movl(const Address& dst, Register src) { 124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movl(const Address& dst, const Immediate& imm) { 131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC7); 133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, dst); 134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movzxb(Register dst, ByteRegister src) { 139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movzxb(Register dst, const Address& src) { 147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB6); 150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsxb(Register dst, ByteRegister src) { 155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsxb(Register dst, const Address& src) { 163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBE); 166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movb(Register dst, const Address& src) { 171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxb or movsxb instead."; 172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movb(const Address& dst, ByteRegister src) { 176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x88); 178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movb(const Address& dst, const Immediate& imm) { 183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC6); 185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(EAX, dst); 186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 188a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 189a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 190a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 191a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movzxw(Register dst, Register src) { 192a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movzxw(Register dst, const Address& src) { 200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB7); 203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsxw(Register dst, Register src) { 208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsxw(Register dst, const Address& src) { 216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xBF); 219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movw(Register dst, const Address& src) { 224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro LOG(FATAL) << "Use movzxw or movsxw instead."; 225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movw(const Address& dst, Register src) { 229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperandSizeOverride(); 231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x89); 232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::leal(Register dst, const Address& src) { 237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x8D); 239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 243b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::cmovl(Condition condition, Register dst, Register src) { 244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 246b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x40 + condition); 247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 251b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::setb(Condition condition, Register dst) { 252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 254b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x90 + condition); 255b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitOperand(0, Operand(dst)); 256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movss(XmmRegister dst, const Address& src) { 260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movss(const Address& dst, XmmRegister src) { 269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movss(XmmRegister dst, XmmRegister src) { 278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movd(XmmRegister dst, Register src) { 287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x6E); 291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movd(Register dst, XmmRegister src) { 296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x7E); 300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, Operand(dst)); 301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addss(XmmRegister dst, XmmRegister src) { 305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addss(XmmRegister dst, const Address& src) { 314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subss(XmmRegister dst, XmmRegister src) { 323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subss(XmmRegister dst, const Address& src) { 332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mulss(XmmRegister dst, XmmRegister src) { 341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mulss(XmmRegister dst, const Address& src) { 350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::divss(XmmRegister dst, XmmRegister src) { 359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::divss(XmmRegister dst, const Address& src) { 368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 372a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 373a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 374a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 375a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 376a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::flds(const Address& src) { 377a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 378a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 379a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 380a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 381a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 382a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 383a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fstps(const Address& dst) { 384a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 385a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 386a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 387a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 388a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 389a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 390a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsd(XmmRegister dst, const Address& src) { 391a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 392a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 393a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 394a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x10); 395a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 396a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 397a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 398a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 399a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsd(const Address& dst, XmmRegister src) { 400a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 401a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 402a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 403a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 404a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(src, dst); 405a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 406a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 407a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 408a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::movsd(XmmRegister dst, XmmRegister src) { 409a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 410a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 411a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 412a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x11); 413a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(src, dst); 414a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 415a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 416a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 417a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addsd(XmmRegister dst, XmmRegister src) { 418a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 419a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 420a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 421a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 422a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 423a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 424a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 425a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 426a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addsd(XmmRegister dst, const Address& src) { 427a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 428a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 429a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 430a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x58); 431a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 432a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 433a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 434a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 435a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subsd(XmmRegister dst, XmmRegister src) { 436a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 437a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 438a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 439a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 440a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 441a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 442a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 443a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 444a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subsd(XmmRegister dst, const Address& src) { 445a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 446a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 447a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 448a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5C); 449a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 450a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 451a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 452a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 453a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mulsd(XmmRegister dst, XmmRegister src) { 454a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 455a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 456a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 457a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 458a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 459a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 460a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 461a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 462a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mulsd(XmmRegister dst, const Address& src) { 463a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 464a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 465a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 466a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x59); 467a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 468a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 469a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 470a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 471a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::divsd(XmmRegister dst, XmmRegister src) { 472a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 473a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 474a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 475a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 476a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 477a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 478a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 479a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 480a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::divsd(XmmRegister dst, const Address& src) { 481a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 482a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 483a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 484a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5E); 485a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 486a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 487a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 488a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 489a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtsi2ss(XmmRegister dst, Register src) { 490a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 491a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 492a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 493a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 494a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 495a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 496a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 497a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 498a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtsi2sd(XmmRegister dst, Register src) { 499a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 500a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 501a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 502a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2A); 503a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 504a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 505a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 506a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 507a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtss2si(Register dst, XmmRegister src) { 508a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 509a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 510a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 511a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 512a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 513a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 514a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 515a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 516a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 517a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 518a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 519a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 520a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 521a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 522a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 523a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 524a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 525a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtsd2si(Register dst, XmmRegister src) { 526a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 527a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 528a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 529a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2D); 530a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 531a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 532a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 533a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 534a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvttss2si(Register dst, XmmRegister src) { 535a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 536a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 537a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 538a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 539a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 540a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 541a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 542a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 543a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvttsd2si(Register dst, XmmRegister src) { 544a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 545a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 546a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 547a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2C); 548a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 549a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 550a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 551a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 552a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 553a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 554a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 555a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 556a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x5A); 557a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 558a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 559a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 560a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 561a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 562a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 563a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 564a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 565a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE6); 566a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 567a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 568a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 569a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 570a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::comiss(XmmRegister a, XmmRegister b) { 571a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 572a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 573a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 574a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 575a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 576a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 577a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 578a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::comisd(XmmRegister a, XmmRegister b) { 579a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 580a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 581a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 582a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2F); 583a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(a, b); 584a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 585a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 586a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 587a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 588a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 589a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 590a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 591a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 592a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 593a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 594a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 595a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 596a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 597a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF3); 599a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 600a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x51); 601a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 602a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 603a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 604a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 605a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xorpd(XmmRegister dst, const Address& src) { 606a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 607a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 608a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 609a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 610a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 611a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 612a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 613a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 614a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xorpd(XmmRegister dst, XmmRegister src) { 615a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 616a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 617a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 618a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 619a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 620a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 621a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 622a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 623a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xorps(XmmRegister dst, const Address& src) { 624a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 625a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 626a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 627a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 628a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 629a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 630a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 631a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xorps(XmmRegister dst, XmmRegister src) { 632a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 633a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 634a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x57); 635a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitXmmRegisterOperand(dst, src); 636a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 637a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 638a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 639a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::andpd(XmmRegister dst, const Address& src) { 640a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 641a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x66); 642a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 643a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x54); 644a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, src); 645a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 646a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 647a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 648a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fldl(const Address& src) { 649a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 650a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 651a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, src); 652a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 653a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 654a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 655a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fstpl(const Address& dst) { 656a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 657a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 658a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 659a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 660a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 661a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 662a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fnstcw(const Address& dst) { 663a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 664a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 665a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 666a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 667a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 668a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 669a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fldcw(const Address& src) { 670a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 671a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 672a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 673a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 674a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 675a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 676a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fistpl(const Address& dst) { 677a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 678a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 679a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(7, dst); 680a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 681a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 682a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 683a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fistps(const Address& dst) { 684a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 685a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDB); 686a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, dst); 687a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 688a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 689a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 690a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fildl(const Address& src) { 691a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 692a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDF); 693a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, src); 694a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 695a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 696a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 697a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fincstp() { 698a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 699a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 700a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 701a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 702a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 703a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 704a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::ffree(const Immediate& index) { 705a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(index.value(), 7); 706a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 707a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xDD); 708a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + index.value()); 709a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 710a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 711a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 712a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fsin() { 713a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 714a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 715a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFE); 716a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 717a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 718a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 719a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fcos() { 720a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 721a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 722a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 723a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 724a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 725a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 726a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::fptan() { 727a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 728a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD9); 729a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF2); 730a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 731a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 732a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 733a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xchgl(Register dst, Register src) { 734a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 735a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x87); 736a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 737a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 738a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 739a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 740a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpl(Register reg, const Immediate& imm) { 741a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 742a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, Operand(reg), imm); 743a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 744a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 745a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 746a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpl(Register reg0, Register reg1) { 747a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 748a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 749a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg0, Operand(reg1)); 750a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 751a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 752a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 753a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpl(Register reg, const Address& address) { 754a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 755a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x3B); 756a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 757a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 758a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 759a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 760a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addl(Register dst, Register src) { 761a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 762a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 763a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(dst, src); 764a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 765a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 766a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 767a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addl(Register reg, const Address& address) { 768a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 769a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x03); 770a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 771a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 772a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 773a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 774a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpl(const Address& address, Register reg) { 775a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 776a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x39); 777a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 778a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 779a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 780a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 781a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpl(const Address& address, const Immediate& imm) { 782a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 783a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(7, address, imm); 784a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 785a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 786a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 787a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::testl(Register reg1, Register reg2) { 788a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 789a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x85); 790a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(reg1, reg2); 791a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 792a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 793a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 794a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::testl(Register reg, const Immediate& immediate) { 795a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 796a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 797a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // we only test the byte register to keep the encoding short. 798a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_uint8() && reg < 4) { 799a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use zero-extended 8-bit immediate. 800a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (reg == EAX) { 801a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA8); 802a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 803a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF6); 804a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC0 + reg); 805a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 806a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 807a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (reg == EAX) { 808a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is EAX. 809a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA9); 810a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 811a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 812a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 813a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, Operand(reg)); 814a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 815a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 816a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 817a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 818a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 819a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::andl(Register dst, Register src) { 820a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 821a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x23); 822a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 823a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 824a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 825a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 826a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::andl(Register dst, const Immediate& imm) { 827a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 828a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(4, Operand(dst), imm); 829a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 830a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 831a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 832a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::orl(Register dst, Register src) { 833a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 834a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0B); 835a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 836a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 837a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 838a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 839a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::orl(Register dst, const Immediate& imm) { 840a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 841a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(1, Operand(dst), imm); 842a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 843a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 844a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 845a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::xorl(Register dst, Register src) { 846a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 847a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x33); 848a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 849a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 850a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 851a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 852a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addl(Register reg, const Immediate& imm) { 853a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 854a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, Operand(reg), imm); 855a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 856a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 857a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 858a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addl(const Address& address, Register reg) { 859a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 860a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x01); 861a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 862a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 863a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 864a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 865a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::addl(const Address& address, const Immediate& imm) { 866a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 867a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(0, address, imm); 868a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 869a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 870a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 871a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::adcl(Register reg, const Immediate& imm) { 872a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 873a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(2, Operand(reg), imm); 874a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 875a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 876a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 877a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::adcl(Register dst, Register src) { 878a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 879a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 880a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 881a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 882a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 883a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 884a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::adcl(Register dst, const Address& address) { 885a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 886a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x13); 887a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 888a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 889a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 890a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 891a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subl(Register dst, Register src) { 892a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 893a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 894a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 895a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 896a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 897a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 898a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subl(Register reg, const Immediate& imm) { 899a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 900a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(5, Operand(reg), imm); 901a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 902a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 903a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 904a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::subl(Register reg, const Address& address) { 905a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 906a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x2B); 907a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 908a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 909a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 910a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 911a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cdq() { 912a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 913a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x99); 914a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 915a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 916a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 917a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::idivl(Register reg) { 918a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 919a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 920a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF8 | reg); 921a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 922a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 923a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 924a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::imull(Register dst, Register src) { 925a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 926a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 927a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 928a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 929a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 930a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 931a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 932a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::imull(Register reg, const Immediate& imm) { 933a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 934a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x69); 935a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, Operand(reg)); 936a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(imm); 937a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 938a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 939a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 940a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::imull(Register reg, const Address& address) { 941a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 942a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 943a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xAF); 944a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 945a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 946a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 947a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 948a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::imull(Register reg) { 949a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 950a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 951a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, Operand(reg)); 952a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 953a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 954a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 955a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::imull(const Address& address) { 956a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 957a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 958a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(5, address); 959a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 960a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 961a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 962a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mull(Register reg) { 963a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 964a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 965a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, Operand(reg)); 966a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 967a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 968a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 969a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::mull(const Address& address) { 970a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 971a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 972a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(4, address); 973a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 974a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 975a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 976a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sbbl(Register dst, Register src) { 977a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 978a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 979a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, Operand(src)); 980a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 981a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 982a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 983a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sbbl(Register reg, const Immediate& imm) { 984a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 985a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitComplex(3, Operand(reg), imm); 986a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 987a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 988a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 989a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sbbl(Register dst, const Address& address) { 990a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 991a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x1B); 992a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(dst, address); 993a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 994a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 995a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 996a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::incl(Register reg) { 997a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 998a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x40 + reg); 999a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1000a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1001a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1002a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::incl(const Address& address) { 1003a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1004a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1005a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(0, address); 1006a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1007a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1008a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1009a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::decl(Register reg) { 1010a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1011a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x48 + reg); 1012a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1013a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1014a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1015a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::decl(const Address& address) { 1016a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1017a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1018a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(1, address); 1019a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1020a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1021a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1022a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::shll(Register reg, const Immediate& imm) { 1023a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, reg, imm); 1024a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1025a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1026a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1027a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::shll(Register operand, Register shifter) { 1028a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(4, operand, shifter); 1029a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1030a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1031a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1032a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::shrl(Register reg, const Immediate& imm) { 1033a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, reg, imm); 1034a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1035a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1036a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1037a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::shrl(Register operand, Register shifter) { 1038a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(5, operand, shifter); 1039a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1040a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1041a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1042a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sarl(Register reg, const Immediate& imm) { 1043a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, reg, imm); 1044a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1045a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1046a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1047a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::sarl(Register operand, Register shifter) { 1048a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitGenericShift(7, operand, shifter); 1049a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1050a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1051a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1052a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::shld(Register dst, Register src) { 1053a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1054a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1055a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xA5); 1056a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(src, dst); 1057a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1058a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1059a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1060a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::negl(Register reg) { 1061a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1062a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1063a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(3, Operand(reg)); 1064a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1065a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1066a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1067a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::notl(Register reg) { 1068a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1069a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF7); 1070a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD0 | reg); 1071a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1072a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1073a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1074a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::enter(const Immediate& imm) { 1075a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1076a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC8); 1077a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1078a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1079a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1080a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x00); 1081a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1082a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1083a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1084a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::leave() { 1085a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1086a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC9); 1087a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1088a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1089a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1090a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::ret() { 1091a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1092a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC3); 1093a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1094a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1095a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1096a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::ret(const Immediate& imm) { 1097a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1098a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC2); 1099a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_uint16()); 1100a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1101a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((imm.value() >> 8) & 0xFF); 1102a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1103a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1104a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1105a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1106a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::nop() { 1107a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1108a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x90); 1109a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1110a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1111a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1112a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::int3() { 1113a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1114a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xCC); 1115a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1116a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1117a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1118a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::hlt() { 1119a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1120a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF4); 1121a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1122a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1123a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1124a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::j(Condition condition, Label* label) { 1125a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1126a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1127a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1128a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 6; 1129a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1130a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1131a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1132a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x70 + condition); 1133a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1134a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1135a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1136a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1137a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1138a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1139a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1140a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1141a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x80 + condition); 1142a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1143a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1144a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1145a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1146a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1147a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::jmp(Register reg) { 1148a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1149a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xFF); 1150a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitRegisterOperand(4, reg); 1151a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1152a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1153a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1154a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::jmp(Label* label) { 1155a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1156a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1157a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kShortSize = 2; 1158a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const int kLongSize = 5; 1159a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1160a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1161a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (IsInt(8, offset - kShortSize)) { 1162a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xEB); 1163a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8((offset - kShortSize) & 0xFF); 1164a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1165a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1166a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - kLongSize); 1167a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1168a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1169a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xE9); 1170a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1171a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1172a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1173a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1174a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1175a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::lock() { 1176a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1177a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xF0); 1178a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1179a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1180a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1181a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::cmpxchgl(const Address& address, Register reg) { 1182a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1183a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x0F); 1184a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xB1); 1185a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(reg, address); 1186a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1187a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1188b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::fs() { 1189b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: fs is a prefix and not an instruction 1190b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1191b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers EmitUint8(0x64); 1192b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1193a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1194a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::AddImmediate(Register reg, const Immediate& imm) { 1195a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int value = imm.value(); 1196a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value > 0) { 1197a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1198a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro incl(reg); 1199a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1200a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(reg, imm); 1201a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1202a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value < 0) { 1203a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro value = -value; 1204a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (value == 1) { 1205a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro decl(reg); 1206a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (value != 0) { 1207a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro subl(reg, Immediate(value)); 1208a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1209a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1210a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1211a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1212a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1213a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 1214a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // TODO: Need to have a code constants table. 1215a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int64_t constant = bit_cast<int64_t, double>(value); 1216a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(High32Bits(constant))); 1217a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro pushl(Immediate(Low32Bits(constant))); 1218a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro movsd(dst, Address(ESP, 0)); 1219a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro addl(ESP, Immediate(2 * kWordSize)); 1220a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1221a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1222a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1223a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::FloatNegate(XmmRegister f) { 1224a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1225a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t a; 1226a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t b; 1227a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t c; 1228a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint32_t d; 1229a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } float_negate_constant __attribute__((aligned(16))) = 1230a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro { 0x80000000, 0x00000000, 0x80000000, 0x00000000 }; 1231a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorps(f, Address::Absolute(reinterpret_cast<uword>(&float_negate_constant))); 1232a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1233a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1234a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1235a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::DoubleNegate(XmmRegister d) { 1236a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1237a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1238a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1239a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_negate_constant __attribute__((aligned(16))) = 1240a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x8000000000000000LL, 0x8000000000000000LL}; 1241a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro xorpd(d, Address::Absolute(reinterpret_cast<uword>(&double_negate_constant))); 1242a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1243a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1244a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1245a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::DoubleAbs(XmmRegister reg) { 1246a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro static const struct { 1247a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t a; 1248a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro uint64_t b; 1249a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } double_abs_constant __attribute__((aligned(16))) = 1250a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}; 1251a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro andpd(reg, Address::Absolute(reinterpret_cast<uword>(&double_abs_constant))); 1252a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1253a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1254a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1255a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::Align(int alignment, int offset) { 1256a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(IsPowerOfTwo(alignment)); 1257a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit nop instruction until the real position is aligned. 1258a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 1259a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro nop(); 1260a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1261a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1262a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1263a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1264a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::Bind(Label* label) { 1265a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int bound = buffer_.Size(); 1266a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); // Labels can only be bound once. 1267a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro while (label->IsLinked()) { 1268a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = label->LinkPosition(); 1269a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int next = buffer_.Load<int32_t>(position); 1270a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro buffer_.Store<int32_t>(position, bound - (position + 4)); 1271a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->position_ = next; 1272a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1273a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->BindTo(bound); 1274a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1275a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1276a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1277a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::Stop(const char* message) { 1278a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the message address as immediate operand in the test rax instruction, 1279a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // followed by the int3 instruction. 1280a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Execution can be resumed with the 'cont' command in gdb. 1281a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro testl(EAX, Immediate(reinterpret_cast<int32_t>(message))); 1282a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int3(); 1283a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1284a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1285a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1286a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitOperand(int rm, const Operand& operand) { 1287a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 1288a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 1289a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const int length = operand.length_; 1290a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GT(length, 0); 1291a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the ModRM byte updated with the given RM value. 1292a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(operand.encoding_[0] & 0x38, 0); 1293a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[0] + (rm << 3)); 1294a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Emit the rest of the encoded operand. 1295a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro for (int i = 1; i < length; i++) { 1296a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(operand.encoding_[i]); 1297a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1298a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1299a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1300a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1301a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitImmediate(const Immediate& imm) { 1302a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(imm.value()); 1303a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1304a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1305a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1306a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitComplex(int rm, 1307a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const Operand& operand, 1308a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const Immediate& immediate) { 1309a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_GE(rm, 0); 1310a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(rm, 8); 1311a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (immediate.is_int8()) { 1312a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use sign-extended 8-bit immediate. 1313a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x83); 1314a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, operand); 1315a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(immediate.value() & 0xFF); 1316a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else if (operand.IsRegister(EAX)) { 1317a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro // Use short form if the destination is eax. 1318a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x05 + (rm << 3)); 1319a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1320a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1321a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0x81); 1322a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, operand); 1323a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitImmediate(immediate); 1324a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1325a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1326a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1327a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1328a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitLabel(Label* label, int instruction_size) { 1329a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (label->IsBound()) { 1330a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int offset = label->Position() - buffer_.Size(); 1331a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LE(offset, 0); 1332a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(offset - instruction_size); 1333a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1334a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitLabelLink(label); 1335a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1336a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1337a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1338a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1339a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitLabelLink(Label* label) { 1340a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(!label->IsBound()); 1341a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro int position = buffer_.Size(); 1342a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitInt32(label->position_); 1343a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro label->LinkTo(position); 1344a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1345a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1346a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1347a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitGenericShift(int rm, 1348a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register reg, 1349a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro const Immediate& imm) { 1350a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1351a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK(imm.is_int8()); 1352a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro if (imm.value() == 1) { 1353a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD1); 1354a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(reg)); 1355a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } else { 1356a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xC1); 1357a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(reg)); 1358a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(imm.value() & 0xFF); 1359a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro } 1360a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1361a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1362a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1363a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirovoid Assembler::EmitGenericShift(int rm, 1364a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register operand, 1365a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro Register shifter) { 1366a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1367a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_EQ(shifter, ECX); 1368a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitUint8(0xD3); 1369a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro EmitOperand(rm, Operand(operand)); 1370a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 1371a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 1372b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Emit code that will create an activation on the stack 1373b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::BuildFrame(size_t frame_size, ManagedRegister method_reg) { 1374b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsAligned(frame_size, 16)); 1375b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // return address then method on stack 1376b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-frame_size + 4 /*method*/ + 4 /*return address*/)); 1377b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers pushl(method_reg.AsCpuRegister()); 1378b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1379b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1380b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Emit code that will remove an activation from the stack 1381b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::RemoveFrame(size_t frame_size) { 1382b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsAligned(frame_size, 16)); 1383b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(frame_size - 4)); 1384b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ret(); 1385b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1386b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1387b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::IncreaseFrameSize(size_t adjust) { 1388b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsAligned(adjust, 16)); 1389b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(-adjust)); 1390b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1391b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1392b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::DecreaseFrameSize(size_t adjust) { 1393b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(IsAligned(adjust, 16)); 1394b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers addl(ESP, Immediate(adjust)); 1395b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1396b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1397b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Store bytes from the given register onto the stack 1398b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::Store(FrameOffset offs, ManagedRegister src, size_t size) { 1399b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (src.IsCpuRegister()) { 1400b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1401b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, offs), src.AsCpuRegister()); 1402b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else if (src.IsXmmRegister()) { 1403b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (size == 4) { 1404b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movss(Address(ESP, offs), src.AsXmmRegister()); 1405b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1406b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movsd(Address(ESP, offs), src.AsXmmRegister()); 1407b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1408b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1409b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1410b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1411b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::StoreRef(FrameOffset dest, ManagedRegister src) { 1412b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(src.IsCpuRegister()); 1413b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), src.AsCpuRegister()); 1414b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1415b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1416b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::CopyRef(FrameOffset dest, FrameOffset src, 1417b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister scratch) { 1418b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1419b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, src)); 1420b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), scratch.AsCpuRegister()); 1421b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1422b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1423b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::StoreImmediateToFrame(FrameOffset dest, uint32_t imm, 1424b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister) { 1425b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address(ESP, dest), Immediate(imm)); 1426b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1427b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1428b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::StoreImmediateToThread(ThreadOffset dest, uint32_t imm, 1429b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister) { 1430b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers fs(); 1431b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address::Absolute(dest), Immediate(imm)); 1432b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1433b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1434b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::Load(ManagedRegister dest, FrameOffset src, size_t size) { 1435b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (dest.IsCpuRegister()) { 1436b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK_EQ(4u, size); 1437b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 1438b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1439b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: x87, SSE 1440b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers LOG(FATAL) << "Unimplemented"; 1441b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1442b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1443b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1444b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::LoadRef(ManagedRegister dest, FrameOffset src) { 1445b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 1446b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(ESP, src)); 1447b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1448b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1449b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::LoadRef(ManagedRegister dest, ManagedRegister base, 1450b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers MemberOffset offs) { 1451b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister() && dest.IsCpuRegister()); 1452b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address(base.AsCpuRegister(), offs)); 1453b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1454b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1455b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::LoadRawPtrFromThread(ManagedRegister dest, ThreadOffset offs) { 1456b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(dest.IsCpuRegister()); 1457b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers fs(); 1458b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), Address::Absolute(offs)); 1459b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1460b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1461b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::CopyRawPtrFromThread(FrameOffset fr_offs, ThreadOffset thr_offs, 1462b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister scratch) { 1463b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1464b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers fs(); 1465b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(scratch.AsCpuRegister(), Address::Absolute(thr_offs)); 1466b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(fr_offs, scratch, 4); 1467b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1468b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1469b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::CopyRawPtrToThread(ThreadOffset thr_offs, FrameOffset fr_offs, 1470b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister scratch) { 1471b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1472b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, fr_offs, 4); 1473b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers fs(); 1474b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1475b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1476b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1477b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::StoreStackOffsetToThread(ThreadOffset thr_offs, 1478b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers FrameOffset fr_offs, 1479b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister scratch) { 1480b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1481b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, fr_offs)); 1482b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers fs(); 1483b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(Address::Absolute(thr_offs), scratch.AsCpuRegister()); 1484b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1485b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1486b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::Move(ManagedRegister dest, ManagedRegister src) { 1487b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!dest.Equals(src)) { 1488b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (dest.IsCpuRegister() && src.IsCpuRegister()) { 1489b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(dest.AsCpuRegister(), src.AsCpuRegister()); 1490b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1491b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: x87, SSE 1492b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers LOG(FATAL) << "Unimplemented"; 1493b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1494b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1495b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1496b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1497b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch, 1498b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers size_t size) { 1499b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (scratch.IsCpuRegister() && size == 8) { 1500b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, 4); 1501b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, 4); 1502b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, FrameOffset(src.Int32Value() + 4), 4); 1503b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(FrameOffset(dest.Int32Value() + 4), scratch, 4); 1504b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1505b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Load(scratch, src, size); 1506b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(dest, scratch, size); 1507b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1508b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1509b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1510b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::CreateStackHandle(ManagedRegister out_reg, 1511b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers FrameOffset handle_offset, 1512b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister in_reg, bool null_allowed) { 1513b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1514b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1515b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ValidateRef(in_reg, null_allowed); 1516b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1517b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1518b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1519b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1520b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1521b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 1522b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers j(ZERO, &null_arg); 1523b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers leal(out_reg.AsCpuRegister(), Address(ESP, handle_offset)); 1524b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1525b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1526b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers leal(out_reg.AsCpuRegister(), Address(ESP, handle_offset)); 1527b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1528b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1529b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1530b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::CreateStackHandle(FrameOffset out_off, 1531b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers FrameOffset handle_offset, 1532b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister scratch, bool null_allowed) { 1533b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(scratch.IsCpuRegister()); 1534b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (null_allowed) { 1535b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1536b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(scratch.AsCpuRegister(), Address(ESP, handle_offset)); 1537b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(scratch.AsCpuRegister(), scratch.AsCpuRegister()); 1538b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers j(ZERO, &null_arg); 1539b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, handle_offset)); 1540b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1541b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } else { 1542b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers leal(scratch.AsCpuRegister(), Address(ESP, handle_offset)); 1543b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1544b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Store(out_off, scratch, 4); 1545b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1546b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1547b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Given a stack handle, load the associated reference. 1548b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::LoadReferenceFromStackHandle(ManagedRegister out_reg, 1549b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister in_reg, 1550b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers FrameOffset shb_offset) { 1551b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(out_reg.IsCpuRegister()); 1552b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(in_reg.IsCpuRegister()); 1553b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Label null_arg; 1554b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers if (!out_reg.Equals(in_reg)) { 1555b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers xorl(out_reg.AsCpuRegister(), out_reg.AsCpuRegister()); 1556b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers } 1557b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers testl(in_reg.AsCpuRegister(), in_reg.AsCpuRegister()); 1558b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers j(ZERO, &null_arg); 1559b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers movl(out_reg.AsCpuRegister(), Address(in_reg.AsCpuRegister(), 0)); 1560b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers Bind(&null_arg); 1561b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1562b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1563b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::ValidateRef(ManagedRegister src, bool could_be_null) { 1564b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1565b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1566b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1567b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::ValidateRef(FrameOffset src, bool could_be_null) { 1568b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: not validating references 1569b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1570b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1571b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::Call(ManagedRegister base, MemberOffset offset, 1572b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers ManagedRegister) { 1573b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers CHECK(base.IsCpuRegister()); 1574b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers call(Address(base.AsCpuRegister(), offset)); 1575b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers // TODO: place reference map on call 1576b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1577b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1578b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Emit code that will lock the reference in the given register 1579b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::LockReferenceOnStack(FrameOffset fr_offs) { 1580b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers LOG(FATAL) << "TODO"; 1581b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1582b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// Emit code that will unlock the reference in the given register 1583b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersvoid Assembler::UnLockReferenceOnStack(FrameOffset fr_offs) { 1584b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers LOG(FATAL) << "TODO"; 1585b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} 1586b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1587b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers 1588b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers} // namespace art 1589