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