Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Side by Side Diff: src/assembler_ia32.cpp

Issue 1114223002: Rename AssemblerX86 to AssemblerX8632 so it works with SZTargets.def. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/assembler_ia32.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// 1 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===//
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 // 5 //
6 // Modified by the Subzero authors. 6 // Modified by the Subzero authors.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // The Subzero Code Generator 10 // The Subzero Code Generator
11 // 11 //
12 // This file is distributed under the University of Illinois Open Source 12 // This file is distributed under the University of Illinois Open Source
13 // License. See LICENSE.TXT for details. 13 // License. See LICENSE.TXT for details.
14 // 14 //
15 //===----------------------------------------------------------------------===// 15 //===----------------------------------------------------------------------===//
16 // 16 //
17 // This file implements the Assembler class for x86-32. 17 // This file implements the Assembler class for x86-32.
18 // 18 //
19 //===----------------------------------------------------------------------===// 19 //===----------------------------------------------------------------------===//
20 20
21 #include "assembler_ia32.h" 21 #include "assembler_ia32.h"
22 #include "IceCfg.h" 22 #include "IceCfg.h"
23 #include "IceOperand.h" 23 #include "IceOperand.h"
24 24
25 namespace Ice { 25 namespace Ice {
26 namespace x86 { 26 namespace X8632 {
27 27
28 Address Address::ofConstPool(Assembler *Asm, const Constant *Imm) { 28 Address Address::ofConstPool(Assembler *Asm, const Constant *Imm) {
29 AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm); 29 AssemblerFixup *Fixup = Asm->createFixup(llvm::ELF::R_386_32, Imm);
30 const RelocOffsetT Offset = 0; 30 const RelocOffsetT Offset = 0;
31 return x86::Address::Absolute(Offset, Fixup); 31 return Address::Absolute(Offset, Fixup);
32 } 32 }
33 33
34 AssemblerX86::~AssemblerX86() { 34 AssemblerX8632::~AssemblerX8632() {
35 #ifndef NDEBUG 35 #ifndef NDEBUG
36 for (const Label *Label : CfgNodeLabels) { 36 for (const Label *Label : CfgNodeLabels) {
37 Label->FinalCheck(); 37 Label->FinalCheck();
38 } 38 }
39 for (const Label *Label : LocalLabels) { 39 for (const Label *Label : LocalLabels) {
40 Label->FinalCheck(); 40 Label->FinalCheck();
41 } 41 }
42 #endif 42 #endif
43 } 43 }
44 44
45 void AssemblerX86::alignFunction() { 45 void AssemblerX8632::alignFunction() {
46 SizeT Align = 1 << getBundleAlignLog2Bytes(); 46 SizeT Align = 1 << getBundleAlignLog2Bytes();
47 SizeT BytesNeeded = Utils::OffsetToAlignment(buffer_.GetPosition(), Align); 47 SizeT BytesNeeded = Utils::OffsetToAlignment(buffer_.GetPosition(), Align);
48 const SizeT HltSize = 1; 48 const SizeT HltSize = 1;
49 while (BytesNeeded > 0) { 49 while (BytesNeeded > 0) {
50 hlt(); 50 hlt();
51 BytesNeeded -= HltSize; 51 BytesNeeded -= HltSize;
52 } 52 }
53 } 53 }
54 54
55 Label *AssemblerX86::GetOrCreateLabel(SizeT Number, LabelVector &Labels) { 55 Label *AssemblerX8632::GetOrCreateLabel(SizeT Number, LabelVector &Labels) {
56 Label *L = nullptr; 56 Label *L = nullptr;
57 if (Number == Labels.size()) { 57 if (Number == Labels.size()) {
58 L = new (this->Allocate<Label>()) Label(); 58 L = new (this->Allocate<Label>()) Label();
59 Labels.push_back(L); 59 Labels.push_back(L);
60 return L; 60 return L;
61 } 61 }
62 if (Number > Labels.size()) { 62 if (Number > Labels.size()) {
63 Labels.resize(Number + 1); 63 Labels.resize(Number + 1);
64 } 64 }
65 L = Labels[Number]; 65 L = Labels[Number];
66 if (!L) { 66 if (!L) {
67 L = new (this->Allocate<Label>()) Label(); 67 L = new (this->Allocate<Label>()) Label();
68 Labels[Number] = L; 68 Labels[Number] = L;
69 } 69 }
70 return L; 70 return L;
71 } 71 }
72 72
73 Label *AssemblerX86::GetOrCreateCfgNodeLabel(SizeT NodeNumber) { 73 Label *AssemblerX8632::GetOrCreateCfgNodeLabel(SizeT NodeNumber) {
74 return GetOrCreateLabel(NodeNumber, CfgNodeLabels); 74 return GetOrCreateLabel(NodeNumber, CfgNodeLabels);
75 } 75 }
76 76
77 Label *AssemblerX86::GetOrCreateLocalLabel(SizeT Number) { 77 Label *AssemblerX8632::GetOrCreateLocalLabel(SizeT Number) {
78 return GetOrCreateLabel(Number, LocalLabels); 78 return GetOrCreateLabel(Number, LocalLabels);
79 } 79 }
80 80
81 void AssemblerX86::BindCfgNodeLabel(SizeT NodeNumber) { 81 void AssemblerX8632::BindCfgNodeLabel(SizeT NodeNumber) {
82 assert(!getPreliminary()); 82 assert(!getPreliminary());
83 Label *L = GetOrCreateCfgNodeLabel(NodeNumber); 83 Label *L = GetOrCreateCfgNodeLabel(NodeNumber);
84 this->Bind(L); 84 this->Bind(L);
85 } 85 }
86 86
87 void AssemblerX86::BindLocalLabel(SizeT Number) { 87 void AssemblerX8632::BindLocalLabel(SizeT Number) {
88 Label *L = GetOrCreateLocalLabel(Number); 88 Label *L = GetOrCreateLocalLabel(Number);
89 if (!getPreliminary()) 89 if (!getPreliminary())
90 this->Bind(L); 90 this->Bind(L);
91 } 91 }
92 92
93 void AssemblerX86::call(GPRRegister reg) { 93 void AssemblerX8632::call(GPRRegister reg) {
94 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 94 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
95 EmitUint8(0xFF); 95 EmitUint8(0xFF);
96 EmitRegisterOperand(2, reg); 96 EmitRegisterOperand(2, reg);
97 } 97 }
98 98
99 void AssemblerX86::call(const Address &address) { 99 void AssemblerX8632::call(const Address &address) {
100 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
101 EmitUint8(0xFF); 101 EmitUint8(0xFF);
102 EmitOperand(2, address); 102 EmitOperand(2, address);
103 } 103 }
104 104
105 void AssemblerX86::call(const ConstantRelocatable *label) { 105 void AssemblerX8632::call(const ConstantRelocatable *label) {
106 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 106 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
107 intptr_t call_start = buffer_.GetPosition(); 107 intptr_t call_start = buffer_.GetPosition();
108 EmitUint8(0xE8); 108 EmitUint8(0xE8);
109 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label)); 109 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
110 EmitInt32(-4); 110 EmitInt32(-4);
111 assert((buffer_.GetPosition() - call_start) == kCallExternalLabelSize); 111 assert((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
112 (void)call_start; 112 (void)call_start;
113 } 113 }
114 114
115 void AssemblerX86::call(const Immediate &abs_address) { 115 void AssemblerX8632::call(const Immediate &abs_address) {
116 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 116 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
117 intptr_t call_start = buffer_.GetPosition(); 117 intptr_t call_start = buffer_.GetPosition();
118 EmitUint8(0xE8); 118 EmitUint8(0xE8);
119 EmitFixup( 119 EmitFixup(
120 this->createFixup(llvm::ELF::R_386_PC32, AssemblerFixup::NullSymbol)); 120 this->createFixup(llvm::ELF::R_386_PC32, AssemblerFixup::NullSymbol));
121 EmitInt32(abs_address.value() - 4); 121 EmitInt32(abs_address.value() - 4);
122 assert((buffer_.GetPosition() - call_start) == kCallExternalLabelSize); 122 assert((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
123 (void)call_start; 123 (void)call_start;
124 } 124 }
125 125
126 void AssemblerX86::pushl(GPRRegister reg) { 126 void AssemblerX8632::pushl(GPRRegister reg) {
127 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 127 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
128 EmitUint8(0x50 + reg); 128 EmitUint8(0x50 + reg);
129 } 129 }
130 130
131 void AssemblerX86::popl(GPRRegister reg) { 131 void AssemblerX8632::popl(GPRRegister reg) {
132 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 132 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
133 EmitUint8(0x58 + reg); 133 EmitUint8(0x58 + reg);
134 } 134 }
135 135
136 void AssemblerX86::popl(const Address &address) { 136 void AssemblerX8632::popl(const Address &address) {
137 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 137 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
138 EmitUint8(0x8F); 138 EmitUint8(0x8F);
139 EmitOperand(0, address); 139 EmitOperand(0, address);
140 } 140 }
141 141
142 void AssemblerX86::pushal() { 142 void AssemblerX8632::pushal() {
143 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 143 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
144 EmitUint8(0x60); 144 EmitUint8(0x60);
145 } 145 }
146 146
147 void AssemblerX86::popal() { 147 void AssemblerX8632::popal() {
148 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 148 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
149 EmitUint8(0x61); 149 EmitUint8(0x61);
150 } 150 }
151 151
152 void AssemblerX86::setcc(CondX86::BrCond condition, ByteRegister dst) { 152 void AssemblerX8632::setcc(CondX86::BrCond condition, ByteRegister dst) {
153 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 153 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
154 EmitUint8(0x0F); 154 EmitUint8(0x0F);
155 EmitUint8(0x90 + condition); 155 EmitUint8(0x90 + condition);
156 EmitUint8(0xC0 + dst); 156 EmitUint8(0xC0 + dst);
157 } 157 }
158 158
159 void AssemblerX86::mov(Type Ty, GPRRegister dst, const Immediate &imm) { 159 void AssemblerX8632::mov(Type Ty, GPRRegister dst, const Immediate &imm) {
160 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 160 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
161 if (isByteSizedType(Ty)) { 161 if (isByteSizedType(Ty)) {
162 EmitUint8(0xB0 + dst); 162 EmitUint8(0xB0 + dst);
163 EmitUint8(imm.value() & 0xFF); 163 EmitUint8(imm.value() & 0xFF);
164 return; 164 return;
165 } 165 }
166 if (Ty == IceType_i16) 166 if (Ty == IceType_i16)
167 EmitOperandSizeOverride(); 167 EmitOperandSizeOverride();
168 EmitUint8(0xB8 + dst); 168 EmitUint8(0xB8 + dst);
169 EmitImmediate(Ty, imm); 169 EmitImmediate(Ty, imm);
170 } 170 }
171 171
172 void AssemblerX86::mov(Type Ty, GPRRegister dst, GPRRegister src) { 172 void AssemblerX8632::mov(Type Ty, GPRRegister dst, GPRRegister src) {
173 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 173 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
174 if (Ty == IceType_i16) 174 if (Ty == IceType_i16)
175 EmitOperandSizeOverride(); 175 EmitOperandSizeOverride();
176 if (isByteSizedType(Ty)) { 176 if (isByteSizedType(Ty)) {
177 EmitUint8(0x88); 177 EmitUint8(0x88);
178 } else { 178 } else {
179 EmitUint8(0x89); 179 EmitUint8(0x89);
180 } 180 }
181 EmitRegisterOperand(src, dst); 181 EmitRegisterOperand(src, dst);
182 } 182 }
183 183
184 void AssemblerX86::mov(Type Ty, GPRRegister dst, const Address &src) { 184 void AssemblerX8632::mov(Type Ty, GPRRegister dst, const Address &src) {
185 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 185 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
186 if (Ty == IceType_i16) 186 if (Ty == IceType_i16)
187 EmitOperandSizeOverride(); 187 EmitOperandSizeOverride();
188 if (isByteSizedType(Ty)) { 188 if (isByteSizedType(Ty)) {
189 EmitUint8(0x8A); 189 EmitUint8(0x8A);
190 } else { 190 } else {
191 EmitUint8(0x8B); 191 EmitUint8(0x8B);
192 } 192 }
193 EmitOperand(dst, src); 193 EmitOperand(dst, src);
194 } 194 }
195 195
196 void AssemblerX86::mov(Type Ty, const Address &dst, GPRRegister src) { 196 void AssemblerX8632::mov(Type Ty, const Address &dst, GPRRegister src) {
197 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 197 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
198 if (Ty == IceType_i16) 198 if (Ty == IceType_i16)
199 EmitOperandSizeOverride(); 199 EmitOperandSizeOverride();
200 if (isByteSizedType(Ty)) { 200 if (isByteSizedType(Ty)) {
201 EmitUint8(0x88); 201 EmitUint8(0x88);
202 } else { 202 } else {
203 EmitUint8(0x89); 203 EmitUint8(0x89);
204 } 204 }
205 EmitOperand(src, dst); 205 EmitOperand(src, dst);
206 } 206 }
207 207
208 void AssemblerX86::mov(Type Ty, const Address &dst, const Immediate &imm) { 208 void AssemblerX8632::mov(Type Ty, const Address &dst, const Immediate &imm) {
209 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 209 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
210 if (Ty == IceType_i16) 210 if (Ty == IceType_i16)
211 EmitOperandSizeOverride(); 211 EmitOperandSizeOverride();
212 if (isByteSizedType(Ty)) { 212 if (isByteSizedType(Ty)) {
213 EmitUint8(0xC6); 213 EmitUint8(0xC6);
214 EmitOperand(0, dst); 214 EmitOperand(0, dst);
215 EmitUint8(imm.value() & 0xFF); 215 EmitUint8(imm.value() & 0xFF);
216 } else { 216 } else {
217 EmitUint8(0xC7); 217 EmitUint8(0xC7);
218 EmitOperand(0, dst); 218 EmitOperand(0, dst);
219 EmitImmediate(Ty, imm); 219 EmitImmediate(Ty, imm);
220 } 220 }
221 } 221 }
222 222
223 void AssemblerX86::movzx(Type SrcTy, GPRRegister dst, GPRRegister src) { 223 void AssemblerX8632::movzx(Type SrcTy, GPRRegister dst, GPRRegister src) {
224 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 224 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
225 bool ByteSized = isByteSizedType(SrcTy); 225 bool ByteSized = isByteSizedType(SrcTy);
226 assert(ByteSized || SrcTy == IceType_i16); 226 assert(ByteSized || SrcTy == IceType_i16);
227 EmitUint8(0x0F); 227 EmitUint8(0x0F);
228 EmitUint8(ByteSized ? 0xB6 : 0xB7); 228 EmitUint8(ByteSized ? 0xB6 : 0xB7);
229 EmitRegisterOperand(dst, src); 229 EmitRegisterOperand(dst, src);
230 } 230 }
231 231
232 void AssemblerX86::movzx(Type SrcTy, GPRRegister dst, const Address &src) { 232 void AssemblerX8632::movzx(Type SrcTy, GPRRegister dst, const Address &src) {
233 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 233 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
234 bool ByteSized = isByteSizedType(SrcTy); 234 bool ByteSized = isByteSizedType(SrcTy);
235 assert(ByteSized || SrcTy == IceType_i16); 235 assert(ByteSized || SrcTy == IceType_i16);
236 EmitUint8(0x0F); 236 EmitUint8(0x0F);
237 EmitUint8(ByteSized ? 0xB6 : 0xB7); 237 EmitUint8(ByteSized ? 0xB6 : 0xB7);
238 EmitOperand(dst, src); 238 EmitOperand(dst, src);
239 } 239 }
240 240
241 void AssemblerX86::movsx(Type SrcTy, GPRRegister dst, GPRRegister src) { 241 void AssemblerX8632::movsx(Type SrcTy, GPRRegister dst, GPRRegister src) {
242 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 242 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
243 bool ByteSized = isByteSizedType(SrcTy); 243 bool ByteSized = isByteSizedType(SrcTy);
244 assert(ByteSized || SrcTy == IceType_i16); 244 assert(ByteSized || SrcTy == IceType_i16);
245 EmitUint8(0x0F); 245 EmitUint8(0x0F);
246 EmitUint8(ByteSized ? 0xBE : 0xBF); 246 EmitUint8(ByteSized ? 0xBE : 0xBF);
247 EmitRegisterOperand(dst, src); 247 EmitRegisterOperand(dst, src);
248 } 248 }
249 249
250 void AssemblerX86::movsx(Type SrcTy, GPRRegister dst, const Address &src) { 250 void AssemblerX8632::movsx(Type SrcTy, GPRRegister dst, const Address &src) {
251 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 251 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
252 bool ByteSized = isByteSizedType(SrcTy); 252 bool ByteSized = isByteSizedType(SrcTy);
253 assert(ByteSized || SrcTy == IceType_i16); 253 assert(ByteSized || SrcTy == IceType_i16);
254 EmitUint8(0x0F); 254 EmitUint8(0x0F);
255 EmitUint8(ByteSized ? 0xBE : 0xBF); 255 EmitUint8(ByteSized ? 0xBE : 0xBF);
256 EmitOperand(dst, src); 256 EmitOperand(dst, src);
257 } 257 }
258 258
259 void AssemblerX86::lea(Type Ty, GPRRegister dst, const Address &src) { 259 void AssemblerX8632::lea(Type Ty, GPRRegister dst, const Address &src) {
260 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 260 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
261 assert(Ty == IceType_i16 || Ty == IceType_i32); 261 assert(Ty == IceType_i16 || Ty == IceType_i32);
262 if (Ty == IceType_i16) 262 if (Ty == IceType_i16)
263 EmitOperandSizeOverride(); 263 EmitOperandSizeOverride();
264 EmitUint8(0x8D); 264 EmitUint8(0x8D);
265 EmitOperand(dst, src); 265 EmitOperand(dst, src);
266 } 266 }
267 267
268 void AssemblerX86::cmov(CondX86::BrCond cond, GPRRegister dst, 268 void AssemblerX8632::cmov(CondX86::BrCond cond, GPRRegister dst,
269 GPRRegister src) { 269 GPRRegister src) {
270 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 270 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
271 EmitUint8(0x0F); 271 EmitUint8(0x0F);
272 EmitUint8(0x40 + cond); 272 EmitUint8(0x40 + cond);
273 EmitRegisterOperand(dst, src); 273 EmitRegisterOperand(dst, src);
274 } 274 }
275 275
276 void AssemblerX86::rep_movsb() { 276 void AssemblerX8632::rep_movsb() {
277 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 277 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
278 EmitUint8(0xF3); 278 EmitUint8(0xF3);
279 EmitUint8(0xA4); 279 EmitUint8(0xA4);
280 } 280 }
281 281
282 void AssemblerX86::movss(Type Ty, XmmRegister dst, const Address &src) { 282 void AssemblerX8632::movss(Type Ty, XmmRegister dst, const Address &src) {
283 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 283 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
284 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 284 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
285 EmitUint8(0x0F); 285 EmitUint8(0x0F);
286 EmitUint8(0x10); 286 EmitUint8(0x10);
287 EmitOperand(dst, src); 287 EmitOperand(dst, src);
288 } 288 }
289 289
290 void AssemblerX86::movss(Type Ty, const Address &dst, XmmRegister src) { 290 void AssemblerX8632::movss(Type Ty, const Address &dst, XmmRegister src) {
291 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 291 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
292 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 292 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
293 EmitUint8(0x0F); 293 EmitUint8(0x0F);
294 EmitUint8(0x11); 294 EmitUint8(0x11);
295 EmitOperand(src, dst); 295 EmitOperand(src, dst);
296 } 296 }
297 297
298 void AssemblerX86::movss(Type Ty, XmmRegister dst, XmmRegister src) { 298 void AssemblerX8632::movss(Type Ty, XmmRegister dst, XmmRegister src) {
299 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 299 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
300 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 300 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
301 EmitUint8(0x0F); 301 EmitUint8(0x0F);
302 EmitUint8(0x11); 302 EmitUint8(0x11);
303 EmitXmmRegisterOperand(src, dst); 303 EmitXmmRegisterOperand(src, dst);
304 } 304 }
305 305
306 void AssemblerX86::movd(XmmRegister dst, GPRRegister src) { 306 void AssemblerX8632::movd(XmmRegister dst, GPRRegister src) {
307 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 307 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
308 EmitUint8(0x66); 308 EmitUint8(0x66);
309 EmitUint8(0x0F); 309 EmitUint8(0x0F);
310 EmitUint8(0x6E); 310 EmitUint8(0x6E);
311 EmitRegisterOperand(dst, src); 311 EmitRegisterOperand(dst, src);
312 } 312 }
313 313
314 void AssemblerX86::movd(XmmRegister dst, const Address &src) { 314 void AssemblerX8632::movd(XmmRegister dst, const Address &src) {
315 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 315 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
316 EmitUint8(0x66); 316 EmitUint8(0x66);
317 EmitUint8(0x0F); 317 EmitUint8(0x0F);
318 EmitUint8(0x6E); 318 EmitUint8(0x6E);
319 EmitOperand(dst, src); 319 EmitOperand(dst, src);
320 } 320 }
321 321
322 void AssemblerX86::movd(GPRRegister dst, XmmRegister src) { 322 void AssemblerX8632::movd(GPRRegister dst, XmmRegister src) {
323 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 323 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
324 EmitUint8(0x66); 324 EmitUint8(0x66);
325 EmitUint8(0x0F); 325 EmitUint8(0x0F);
326 EmitUint8(0x7E); 326 EmitUint8(0x7E);
327 EmitRegisterOperand(src, dst); 327 EmitRegisterOperand(src, dst);
328 } 328 }
329 329
330 void AssemblerX86::movd(const Address &dst, XmmRegister src) { 330 void AssemblerX8632::movd(const Address &dst, XmmRegister src) {
331 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 331 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
332 EmitUint8(0x66); 332 EmitUint8(0x66);
333 EmitUint8(0x0F); 333 EmitUint8(0x0F);
334 EmitUint8(0x7E); 334 EmitUint8(0x7E);
335 EmitOperand(src, dst); 335 EmitOperand(src, dst);
336 } 336 }
337 337
338 void AssemblerX86::movq(XmmRegister dst, XmmRegister src) { 338 void AssemblerX8632::movq(XmmRegister dst, XmmRegister src) {
339 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 339 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
340 EmitUint8(0xF3); 340 EmitUint8(0xF3);
341 EmitUint8(0x0F); 341 EmitUint8(0x0F);
342 EmitUint8(0x7E); 342 EmitUint8(0x7E);
343 EmitRegisterOperand(dst, src); 343 EmitRegisterOperand(dst, src);
344 } 344 }
345 345
346 void AssemblerX86::movq(const Address &dst, XmmRegister src) { 346 void AssemblerX8632::movq(const Address &dst, XmmRegister src) {
347 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 347 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
348 EmitUint8(0x66); 348 EmitUint8(0x66);
349 EmitUint8(0x0F); 349 EmitUint8(0x0F);
350 EmitUint8(0xD6); 350 EmitUint8(0xD6);
351 EmitOperand(src, dst); 351 EmitOperand(src, dst);
352 } 352 }
353 353
354 void AssemblerX86::movq(XmmRegister dst, const Address &src) { 354 void AssemblerX8632::movq(XmmRegister dst, const Address &src) {
355 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 355 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
356 EmitUint8(0xF3); 356 EmitUint8(0xF3);
357 EmitUint8(0x0F); 357 EmitUint8(0x0F);
358 EmitUint8(0x7E); 358 EmitUint8(0x7E);
359 EmitOperand(dst, src); 359 EmitOperand(dst, src);
360 } 360 }
361 361
362 void AssemblerX86::addss(Type Ty, XmmRegister dst, XmmRegister src) { 362 void AssemblerX8632::addss(Type Ty, XmmRegister dst, XmmRegister src) {
363 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 363 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
364 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 364 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
365 EmitUint8(0x0F); 365 EmitUint8(0x0F);
366 EmitUint8(0x58); 366 EmitUint8(0x58);
367 EmitXmmRegisterOperand(dst, src); 367 EmitXmmRegisterOperand(dst, src);
368 } 368 }
369 369
370 void AssemblerX86::addss(Type Ty, XmmRegister dst, const Address &src) { 370 void AssemblerX8632::addss(Type Ty, XmmRegister dst, const Address &src) {
371 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 371 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
372 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 372 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
373 EmitUint8(0x0F); 373 EmitUint8(0x0F);
374 EmitUint8(0x58); 374 EmitUint8(0x58);
375 EmitOperand(dst, src); 375 EmitOperand(dst, src);
376 } 376 }
377 377
378 void AssemblerX86::subss(Type Ty, XmmRegister dst, XmmRegister src) { 378 void AssemblerX8632::subss(Type Ty, XmmRegister dst, XmmRegister src) {
379 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 379 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
380 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 380 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
381 EmitUint8(0x0F); 381 EmitUint8(0x0F);
382 EmitUint8(0x5C); 382 EmitUint8(0x5C);
383 EmitXmmRegisterOperand(dst, src); 383 EmitXmmRegisterOperand(dst, src);
384 } 384 }
385 385
386 void AssemblerX86::subss(Type Ty, XmmRegister dst, const Address &src) { 386 void AssemblerX8632::subss(Type Ty, XmmRegister dst, const Address &src) {
387 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 387 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
388 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 388 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
389 EmitUint8(0x0F); 389 EmitUint8(0x0F);
390 EmitUint8(0x5C); 390 EmitUint8(0x5C);
391 EmitOperand(dst, src); 391 EmitOperand(dst, src);
392 } 392 }
393 393
394 void AssemblerX86::mulss(Type Ty, XmmRegister dst, XmmRegister src) { 394 void AssemblerX8632::mulss(Type Ty, XmmRegister dst, XmmRegister src) {
395 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 395 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
396 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 396 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
397 EmitUint8(0x0F); 397 EmitUint8(0x0F);
398 EmitUint8(0x59); 398 EmitUint8(0x59);
399 EmitXmmRegisterOperand(dst, src); 399 EmitXmmRegisterOperand(dst, src);
400 } 400 }
401 401
402 void AssemblerX86::mulss(Type Ty, XmmRegister dst, const Address &src) { 402 void AssemblerX8632::mulss(Type Ty, XmmRegister dst, const Address &src) {
403 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 403 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
404 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 404 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
405 EmitUint8(0x0F); 405 EmitUint8(0x0F);
406 EmitUint8(0x59); 406 EmitUint8(0x59);
407 EmitOperand(dst, src); 407 EmitOperand(dst, src);
408 } 408 }
409 409
410 void AssemblerX86::divss(Type Ty, XmmRegister dst, XmmRegister src) { 410 void AssemblerX8632::divss(Type Ty, XmmRegister dst, XmmRegister src) {
411 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 411 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
412 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 412 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
413 EmitUint8(0x0F); 413 EmitUint8(0x0F);
414 EmitUint8(0x5E); 414 EmitUint8(0x5E);
415 EmitXmmRegisterOperand(dst, src); 415 EmitXmmRegisterOperand(dst, src);
416 } 416 }
417 417
418 void AssemblerX86::divss(Type Ty, XmmRegister dst, const Address &src) { 418 void AssemblerX8632::divss(Type Ty, XmmRegister dst, const Address &src) {
419 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 419 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
420 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 420 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
421 EmitUint8(0x0F); 421 EmitUint8(0x0F);
422 EmitUint8(0x5E); 422 EmitUint8(0x5E);
423 EmitOperand(dst, src); 423 EmitOperand(dst, src);
424 } 424 }
425 425
426 void AssemblerX86::fld(Type Ty, const Address &src) { 426 void AssemblerX8632::fld(Type Ty, const Address &src) {
427 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 427 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
428 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 428 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
429 EmitOperand(0, src); 429 EmitOperand(0, src);
430 } 430 }
431 431
432 void AssemblerX86::fstp(Type Ty, const Address &dst) { 432 void AssemblerX8632::fstp(Type Ty, const Address &dst) {
433 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 433 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
434 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 434 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
435 EmitOperand(3, dst); 435 EmitOperand(3, dst);
436 } 436 }
437 437
438 void AssemblerX86::fstp(X87STRegister st) { 438 void AssemblerX8632::fstp(X87STRegister st) {
439 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 439 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
440 EmitUint8(0xDD); 440 EmitUint8(0xDD);
441 EmitUint8(0xD8 + st); 441 EmitUint8(0xD8 + st);
442 } 442 }
443 443
444 void AssemblerX86::movaps(XmmRegister dst, XmmRegister src) { 444 void AssemblerX8632::movaps(XmmRegister dst, XmmRegister src) {
445 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 445 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
446 EmitUint8(0x0F); 446 EmitUint8(0x0F);
447 EmitUint8(0x28); 447 EmitUint8(0x28);
448 EmitXmmRegisterOperand(dst, src); 448 EmitXmmRegisterOperand(dst, src);
449 } 449 }
450 450
451 void AssemblerX86::movups(XmmRegister dst, XmmRegister src) { 451 void AssemblerX8632::movups(XmmRegister dst, XmmRegister src) {
452 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 452 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
453 EmitUint8(0x0F); 453 EmitUint8(0x0F);
454 EmitUint8(0x10); 454 EmitUint8(0x10);
455 EmitRegisterOperand(dst, src); 455 EmitRegisterOperand(dst, src);
456 } 456 }
457 457
458 void AssemblerX86::movups(XmmRegister dst, const Address &src) { 458 void AssemblerX8632::movups(XmmRegister dst, const Address &src) {
459 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 459 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
460 EmitUint8(0x0F); 460 EmitUint8(0x0F);
461 EmitUint8(0x10); 461 EmitUint8(0x10);
462 EmitOperand(dst, src); 462 EmitOperand(dst, src);
463 } 463 }
464 464
465 void AssemblerX86::movups(const Address &dst, XmmRegister src) { 465 void AssemblerX8632::movups(const Address &dst, XmmRegister src) {
466 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 466 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
467 EmitUint8(0x0F); 467 EmitUint8(0x0F);
468 EmitUint8(0x11); 468 EmitUint8(0x11);
469 EmitOperand(src, dst); 469 EmitOperand(src, dst);
470 } 470 }
471 471
472 void AssemblerX86::padd(Type Ty, XmmRegister dst, XmmRegister src) { 472 void AssemblerX8632::padd(Type Ty, XmmRegister dst, XmmRegister src) {
473 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 473 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
474 EmitUint8(0x66); 474 EmitUint8(0x66);
475 EmitUint8(0x0F); 475 EmitUint8(0x0F);
476 if (isByteSizedArithType(Ty)) { 476 if (isByteSizedArithType(Ty)) {
477 EmitUint8(0xFC); 477 EmitUint8(0xFC);
478 } else if (Ty == IceType_i16) { 478 } else if (Ty == IceType_i16) {
479 EmitUint8(0xFD); 479 EmitUint8(0xFD);
480 } else { 480 } else {
481 EmitUint8(0xFE); 481 EmitUint8(0xFE);
482 } 482 }
483 EmitXmmRegisterOperand(dst, src); 483 EmitXmmRegisterOperand(dst, src);
484 } 484 }
485 485
486 void AssemblerX86::padd(Type Ty, XmmRegister dst, const Address &src) { 486 void AssemblerX8632::padd(Type Ty, XmmRegister dst, const Address &src) {
487 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 487 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
488 EmitUint8(0x66); 488 EmitUint8(0x66);
489 EmitUint8(0x0F); 489 EmitUint8(0x0F);
490 if (isByteSizedArithType(Ty)) { 490 if (isByteSizedArithType(Ty)) {
491 EmitUint8(0xFC); 491 EmitUint8(0xFC);
492 } else if (Ty == IceType_i16) { 492 } else if (Ty == IceType_i16) {
493 EmitUint8(0xFD); 493 EmitUint8(0xFD);
494 } else { 494 } else {
495 EmitUint8(0xFE); 495 EmitUint8(0xFE);
496 } 496 }
497 EmitOperand(dst, src); 497 EmitOperand(dst, src);
498 } 498 }
499 499
500 void AssemblerX86::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) { 500 void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, XmmRegister src) {
501 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 501 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
502 EmitUint8(0x66); 502 EmitUint8(0x66);
503 EmitUint8(0x0F); 503 EmitUint8(0x0F);
504 EmitUint8(0xDB); 504 EmitUint8(0xDB);
505 EmitXmmRegisterOperand(dst, src); 505 EmitXmmRegisterOperand(dst, src);
506 } 506 }
507 507
508 void AssemblerX86::pand(Type /* Ty */, XmmRegister dst, const Address &src) { 508 void AssemblerX8632::pand(Type /* Ty */, XmmRegister dst, const Address &src) {
509 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 509 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
510 EmitUint8(0x66); 510 EmitUint8(0x66);
511 EmitUint8(0x0F); 511 EmitUint8(0x0F);
512 EmitUint8(0xDB); 512 EmitUint8(0xDB);
513 EmitOperand(dst, src); 513 EmitOperand(dst, src);
514 } 514 }
515 515
516 void AssemblerX86::pandn(Type /* Ty */, XmmRegister dst, XmmRegister src) { 516 void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, XmmRegister src) {
517 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 517 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
518 EmitUint8(0x66); 518 EmitUint8(0x66);
519 EmitUint8(0x0F); 519 EmitUint8(0x0F);
520 EmitUint8(0xDF); 520 EmitUint8(0xDF);
521 EmitXmmRegisterOperand(dst, src); 521 EmitXmmRegisterOperand(dst, src);
522 } 522 }
523 523
524 void AssemblerX86::pandn(Type /* Ty */, XmmRegister dst, const Address &src) { 524 void AssemblerX8632::pandn(Type /* Ty */, XmmRegister dst, const Address &src) {
525 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 525 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
526 EmitUint8(0x66); 526 EmitUint8(0x66);
527 EmitUint8(0x0F); 527 EmitUint8(0x0F);
528 EmitUint8(0xDF); 528 EmitUint8(0xDF);
529 EmitOperand(dst, src); 529 EmitOperand(dst, src);
530 } 530 }
531 531
532 void AssemblerX86::pmull(Type Ty, XmmRegister dst, XmmRegister src) { 532 void AssemblerX8632::pmull(Type Ty, XmmRegister dst, XmmRegister src) {
533 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 533 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
534 EmitUint8(0x66); 534 EmitUint8(0x66);
535 EmitUint8(0x0F); 535 EmitUint8(0x0F);
536 if (Ty == IceType_i16) { 536 if (Ty == IceType_i16) {
537 EmitUint8(0xD5); 537 EmitUint8(0xD5);
538 } else { 538 } else {
539 assert(Ty == IceType_i32); 539 assert(Ty == IceType_i32);
540 EmitUint8(0x38); 540 EmitUint8(0x38);
541 EmitUint8(0x40); 541 EmitUint8(0x40);
542 } 542 }
543 EmitXmmRegisterOperand(dst, src); 543 EmitXmmRegisterOperand(dst, src);
544 } 544 }
545 545
546 void AssemblerX86::pmull(Type Ty, XmmRegister dst, const Address &src) { 546 void AssemblerX8632::pmull(Type Ty, XmmRegister dst, const Address &src) {
547 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 547 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
548 EmitUint8(0x66); 548 EmitUint8(0x66);
549 EmitUint8(0x0F); 549 EmitUint8(0x0F);
550 if (Ty == IceType_i16) { 550 if (Ty == IceType_i16) {
551 EmitUint8(0xD5); 551 EmitUint8(0xD5);
552 } else { 552 } else {
553 assert(Ty == IceType_i32); 553 assert(Ty == IceType_i32);
554 EmitUint8(0x38); 554 EmitUint8(0x38);
555 EmitUint8(0x40); 555 EmitUint8(0x40);
556 } 556 }
557 EmitOperand(dst, src); 557 EmitOperand(dst, src);
558 } 558 }
559 559
560 void AssemblerX86::pmuludq(Type /* Ty */, XmmRegister dst, XmmRegister src) { 560 void AssemblerX8632::pmuludq(Type /* Ty */, XmmRegister dst, XmmRegister src) {
561 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 561 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
562 EmitUint8(0x66); 562 EmitUint8(0x66);
563 EmitUint8(0x0F); 563 EmitUint8(0x0F);
564 EmitUint8(0xF4); 564 EmitUint8(0xF4);
565 EmitXmmRegisterOperand(dst, src); 565 EmitXmmRegisterOperand(dst, src);
566 } 566 }
567 567
568 void AssemblerX86::pmuludq(Type /* Ty */, XmmRegister dst, const Address &src) { 568 void AssemblerX8632::pmuludq(Type /* Ty */, XmmRegister dst,
569 const Address &src) {
569 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 570 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
570 EmitUint8(0x66); 571 EmitUint8(0x66);
571 EmitUint8(0x0F); 572 EmitUint8(0x0F);
572 EmitUint8(0xF4); 573 EmitUint8(0xF4);
573 EmitOperand(dst, src); 574 EmitOperand(dst, src);
574 } 575 }
575 576
576 void AssemblerX86::por(Type /* Ty */, XmmRegister dst, XmmRegister src) { 577 void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, XmmRegister src) {
577 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 578 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
578 EmitUint8(0x66); 579 EmitUint8(0x66);
579 EmitUint8(0x0F); 580 EmitUint8(0x0F);
580 EmitUint8(0xEB); 581 EmitUint8(0xEB);
581 EmitXmmRegisterOperand(dst, src); 582 EmitXmmRegisterOperand(dst, src);
582 } 583 }
583 584
584 void AssemblerX86::por(Type /* Ty */, XmmRegister dst, const Address &src) { 585 void AssemblerX8632::por(Type /* Ty */, XmmRegister dst, const Address &src) {
585 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 586 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
586 EmitUint8(0x66); 587 EmitUint8(0x66);
587 EmitUint8(0x0F); 588 EmitUint8(0x0F);
588 EmitUint8(0xEB); 589 EmitUint8(0xEB);
589 EmitOperand(dst, src); 590 EmitOperand(dst, src);
590 } 591 }
591 592
592 void AssemblerX86::psub(Type Ty, XmmRegister dst, XmmRegister src) { 593 void AssemblerX8632::psub(Type Ty, XmmRegister dst, XmmRegister src) {
593 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 594 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
594 EmitUint8(0x66); 595 EmitUint8(0x66);
595 EmitUint8(0x0F); 596 EmitUint8(0x0F);
596 if (isByteSizedArithType(Ty)) { 597 if (isByteSizedArithType(Ty)) {
597 EmitUint8(0xF8); 598 EmitUint8(0xF8);
598 } else if (Ty == IceType_i16) { 599 } else if (Ty == IceType_i16) {
599 EmitUint8(0xF9); 600 EmitUint8(0xF9);
600 } else { 601 } else {
601 EmitUint8(0xFA); 602 EmitUint8(0xFA);
602 } 603 }
603 EmitXmmRegisterOperand(dst, src); 604 EmitXmmRegisterOperand(dst, src);
604 } 605 }
605 606
606 void AssemblerX86::psub(Type Ty, XmmRegister dst, const Address &src) { 607 void AssemblerX8632::psub(Type Ty, XmmRegister dst, const Address &src) {
607 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 608 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
608 EmitUint8(0x66); 609 EmitUint8(0x66);
609 EmitUint8(0x0F); 610 EmitUint8(0x0F);
610 if (isByteSizedArithType(Ty)) { 611 if (isByteSizedArithType(Ty)) {
611 EmitUint8(0xF8); 612 EmitUint8(0xF8);
612 } else if (Ty == IceType_i16) { 613 } else if (Ty == IceType_i16) {
613 EmitUint8(0xF9); 614 EmitUint8(0xF9);
614 } else { 615 } else {
615 EmitUint8(0xFA); 616 EmitUint8(0xFA);
616 } 617 }
617 EmitOperand(dst, src); 618 EmitOperand(dst, src);
618 } 619 }
619 620
620 void AssemblerX86::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) { 621 void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, XmmRegister src) {
621 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 622 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
622 EmitUint8(0x66); 623 EmitUint8(0x66);
623 EmitUint8(0x0F); 624 EmitUint8(0x0F);
624 EmitUint8(0xEF); 625 EmitUint8(0xEF);
625 EmitXmmRegisterOperand(dst, src); 626 EmitXmmRegisterOperand(dst, src);
626 } 627 }
627 628
628 void AssemblerX86::pxor(Type /* Ty */, XmmRegister dst, const Address &src) { 629 void AssemblerX8632::pxor(Type /* Ty */, XmmRegister dst, const Address &src) {
629 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 630 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
630 EmitUint8(0x66); 631 EmitUint8(0x66);
631 EmitUint8(0x0F); 632 EmitUint8(0x0F);
632 EmitUint8(0xEF); 633 EmitUint8(0xEF);
633 EmitOperand(dst, src); 634 EmitOperand(dst, src);
634 } 635 }
635 636
636 void AssemblerX86::psll(Type Ty, XmmRegister dst, XmmRegister src) { 637 void AssemblerX8632::psll(Type Ty, XmmRegister dst, XmmRegister src) {
637 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 638 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
638 EmitUint8(0x66); 639 EmitUint8(0x66);
639 EmitUint8(0x0F); 640 EmitUint8(0x0F);
640 if (Ty == IceType_i16) { 641 if (Ty == IceType_i16) {
641 EmitUint8(0xF1); 642 EmitUint8(0xF1);
642 } else { 643 } else {
643 assert(Ty == IceType_i32); 644 assert(Ty == IceType_i32);
644 EmitUint8(0xF2); 645 EmitUint8(0xF2);
645 } 646 }
646 EmitXmmRegisterOperand(dst, src); 647 EmitXmmRegisterOperand(dst, src);
647 } 648 }
648 649
649 void AssemblerX86::psll(Type Ty, XmmRegister dst, const Address &src) { 650 void AssemblerX8632::psll(Type Ty, XmmRegister dst, const Address &src) {
650 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 651 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
651 EmitUint8(0x66); 652 EmitUint8(0x66);
652 EmitUint8(0x0F); 653 EmitUint8(0x0F);
653 if (Ty == IceType_i16) { 654 if (Ty == IceType_i16) {
654 EmitUint8(0xF1); 655 EmitUint8(0xF1);
655 } else { 656 } else {
656 assert(Ty == IceType_i32); 657 assert(Ty == IceType_i32);
657 EmitUint8(0xF2); 658 EmitUint8(0xF2);
658 } 659 }
659 EmitOperand(dst, src); 660 EmitOperand(dst, src);
660 } 661 }
661 662
662 void AssemblerX86::psll(Type Ty, XmmRegister dst, const Immediate &imm) { 663 void AssemblerX8632::psll(Type Ty, XmmRegister dst, const Immediate &imm) {
663 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 664 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
664 assert(imm.is_int8()); 665 assert(imm.is_int8());
665 EmitUint8(0x66); 666 EmitUint8(0x66);
666 EmitUint8(0x0F); 667 EmitUint8(0x0F);
667 if (Ty == IceType_i16) { 668 if (Ty == IceType_i16) {
668 EmitUint8(0x71); 669 EmitUint8(0x71);
669 } else { 670 } else {
670 assert(Ty == IceType_i32); 671 assert(Ty == IceType_i32);
671 EmitUint8(0x72); 672 EmitUint8(0x72);
672 } 673 }
673 EmitRegisterOperand(6, dst); 674 EmitRegisterOperand(6, dst);
674 EmitUint8(imm.value() & 0xFF); 675 EmitUint8(imm.value() & 0xFF);
675 } 676 }
676 677
677 void AssemblerX86::psra(Type Ty, XmmRegister dst, XmmRegister src) { 678 void AssemblerX8632::psra(Type Ty, XmmRegister dst, XmmRegister src) {
678 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 679 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
679 EmitUint8(0x66); 680 EmitUint8(0x66);
680 EmitUint8(0x0F); 681 EmitUint8(0x0F);
681 if (Ty == IceType_i16) { 682 if (Ty == IceType_i16) {
682 EmitUint8(0xE1); 683 EmitUint8(0xE1);
683 } else { 684 } else {
684 assert(Ty == IceType_i32); 685 assert(Ty == IceType_i32);
685 EmitUint8(0xE2); 686 EmitUint8(0xE2);
686 } 687 }
687 EmitXmmRegisterOperand(dst, src); 688 EmitXmmRegisterOperand(dst, src);
688 } 689 }
689 690
690 void AssemblerX86::psra(Type Ty, XmmRegister dst, const Address &src) { 691 void AssemblerX8632::psra(Type Ty, XmmRegister dst, const Address &src) {
691 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 692 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
692 EmitUint8(0x66); 693 EmitUint8(0x66);
693 EmitUint8(0x0F); 694 EmitUint8(0x0F);
694 if (Ty == IceType_i16) { 695 if (Ty == IceType_i16) {
695 EmitUint8(0xE1); 696 EmitUint8(0xE1);
696 } else { 697 } else {
697 assert(Ty == IceType_i32); 698 assert(Ty == IceType_i32);
698 EmitUint8(0xE2); 699 EmitUint8(0xE2);
699 } 700 }
700 EmitOperand(dst, src); 701 EmitOperand(dst, src);
701 } 702 }
702 703
703 void AssemblerX86::psra(Type Ty, XmmRegister dst, const Immediate &imm) { 704 void AssemblerX8632::psra(Type Ty, XmmRegister dst, const Immediate &imm) {
704 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 705 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
705 assert(imm.is_int8()); 706 assert(imm.is_int8());
706 EmitUint8(0x66); 707 EmitUint8(0x66);
707 EmitUint8(0x0F); 708 EmitUint8(0x0F);
708 if (Ty == IceType_i16) { 709 if (Ty == IceType_i16) {
709 EmitUint8(0x71); 710 EmitUint8(0x71);
710 } else { 711 } else {
711 assert(Ty == IceType_i32); 712 assert(Ty == IceType_i32);
712 EmitUint8(0x72); 713 EmitUint8(0x72);
713 } 714 }
714 EmitRegisterOperand(4, dst); 715 EmitRegisterOperand(4, dst);
715 EmitUint8(imm.value() & 0xFF); 716 EmitUint8(imm.value() & 0xFF);
716 } 717 }
717 718
718 void AssemblerX86::psrl(Type Ty, XmmRegister dst, XmmRegister src) { 719 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, XmmRegister src) {
719 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 720 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
720 EmitUint8(0x66); 721 EmitUint8(0x66);
721 EmitUint8(0x0F); 722 EmitUint8(0x0F);
722 if (Ty == IceType_i16) { 723 if (Ty == IceType_i16) {
723 EmitUint8(0xD1); 724 EmitUint8(0xD1);
724 } else if (Ty == IceType_f64) { 725 } else if (Ty == IceType_f64) {
725 EmitUint8(0xD3); 726 EmitUint8(0xD3);
726 } else { 727 } else {
727 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 728 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
728 EmitUint8(0xD2); 729 EmitUint8(0xD2);
729 } 730 }
730 EmitXmmRegisterOperand(dst, src); 731 EmitXmmRegisterOperand(dst, src);
731 } 732 }
732 733
733 void AssemblerX86::psrl(Type Ty, XmmRegister dst, const Address &src) { 734 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, const Address &src) {
734 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 735 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
735 EmitUint8(0x66); 736 EmitUint8(0x66);
736 EmitUint8(0x0F); 737 EmitUint8(0x0F);
737 if (Ty == IceType_i16) { 738 if (Ty == IceType_i16) {
738 EmitUint8(0xD1); 739 EmitUint8(0xD1);
739 } else if (Ty == IceType_f64) { 740 } else if (Ty == IceType_f64) {
740 EmitUint8(0xD3); 741 EmitUint8(0xD3);
741 } else { 742 } else {
742 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 743 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
743 EmitUint8(0xD2); 744 EmitUint8(0xD2);
744 } 745 }
745 EmitOperand(dst, src); 746 EmitOperand(dst, src);
746 } 747 }
747 748
748 void AssemblerX86::psrl(Type Ty, XmmRegister dst, const Immediate &imm) { 749 void AssemblerX8632::psrl(Type Ty, XmmRegister dst, const Immediate &imm) {
749 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 750 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
750 assert(imm.is_int8()); 751 assert(imm.is_int8());
751 EmitUint8(0x66); 752 EmitUint8(0x66);
752 EmitUint8(0x0F); 753 EmitUint8(0x0F);
753 if (Ty == IceType_i16) { 754 if (Ty == IceType_i16) {
754 EmitUint8(0x71); 755 EmitUint8(0x71);
755 } else if (Ty == IceType_f64) { 756 } else if (Ty == IceType_f64) {
756 EmitUint8(0x73); 757 EmitUint8(0x73);
757 } else { 758 } else {
758 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 759 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
759 EmitUint8(0x72); 760 EmitUint8(0x72);
760 } 761 }
761 EmitRegisterOperand(2, dst); 762 EmitRegisterOperand(2, dst);
762 EmitUint8(imm.value() & 0xFF); 763 EmitUint8(imm.value() & 0xFF);
763 } 764 }
764 765
765 // {add,sub,mul,div}ps are given a Ty parameter for consistency with 766 // {add,sub,mul,div}ps are given a Ty parameter for consistency with
766 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows 767 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows
767 // addpd, etc., we can use the Ty parameter to decide on adding 768 // addpd, etc., we can use the Ty parameter to decide on adding
768 // a 0x66 prefix. 769 // a 0x66 prefix.
769 void AssemblerX86::addps(Type /* Ty */, XmmRegister dst, XmmRegister src) { 770 void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
770 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 771 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
771 EmitUint8(0x0F); 772 EmitUint8(0x0F);
772 EmitUint8(0x58); 773 EmitUint8(0x58);
773 EmitXmmRegisterOperand(dst, src); 774 EmitXmmRegisterOperand(dst, src);
774 } 775 }
775 776
776 void AssemblerX86::addps(Type /* Ty */, XmmRegister dst, const Address &src) { 777 void AssemblerX8632::addps(Type /* Ty */, XmmRegister dst, const Address &src) {
777 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 778 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
778 EmitUint8(0x0F); 779 EmitUint8(0x0F);
779 EmitUint8(0x58); 780 EmitUint8(0x58);
780 EmitOperand(dst, src); 781 EmitOperand(dst, src);
781 } 782 }
782 783
783 void AssemblerX86::subps(Type /* Ty */, XmmRegister dst, XmmRegister src) { 784 void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
784 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 785 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
785 EmitUint8(0x0F); 786 EmitUint8(0x0F);
786 EmitUint8(0x5C); 787 EmitUint8(0x5C);
787 EmitXmmRegisterOperand(dst, src); 788 EmitXmmRegisterOperand(dst, src);
788 } 789 }
789 790
790 void AssemblerX86::subps(Type /* Ty */, XmmRegister dst, const Address &src) { 791 void AssemblerX8632::subps(Type /* Ty */, XmmRegister dst, const Address &src) {
791 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 792 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
792 EmitUint8(0x0F); 793 EmitUint8(0x0F);
793 EmitUint8(0x5C); 794 EmitUint8(0x5C);
794 EmitOperand(dst, src); 795 EmitOperand(dst, src);
795 } 796 }
796 797
797 void AssemblerX86::divps(Type /* Ty */, XmmRegister dst, XmmRegister src) { 798 void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
798 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 799 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
799 EmitUint8(0x0F); 800 EmitUint8(0x0F);
800 EmitUint8(0x5E); 801 EmitUint8(0x5E);
801 EmitXmmRegisterOperand(dst, src); 802 EmitXmmRegisterOperand(dst, src);
802 } 803 }
803 804
804 void AssemblerX86::divps(Type /* Ty */, XmmRegister dst, const Address &src) { 805 void AssemblerX8632::divps(Type /* Ty */, XmmRegister dst, const Address &src) {
805 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 806 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
806 EmitUint8(0x0F); 807 EmitUint8(0x0F);
807 EmitUint8(0x5E); 808 EmitUint8(0x5E);
808 EmitOperand(dst, src); 809 EmitOperand(dst, src);
809 } 810 }
810 811
811 void AssemblerX86::mulps(Type /* Ty */, XmmRegister dst, XmmRegister src) { 812 void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
812 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 813 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
813 EmitUint8(0x0F); 814 EmitUint8(0x0F);
814 EmitUint8(0x59); 815 EmitUint8(0x59);
815 EmitXmmRegisterOperand(dst, src); 816 EmitXmmRegisterOperand(dst, src);
816 } 817 }
817 818
818 void AssemblerX86::mulps(Type /* Ty */, XmmRegister dst, const Address &src) { 819 void AssemblerX8632::mulps(Type /* Ty */, XmmRegister dst, const Address &src) {
819 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 820 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
820 EmitUint8(0x0F); 821 EmitUint8(0x0F);
821 EmitUint8(0x59); 822 EmitUint8(0x59);
822 EmitOperand(dst, src); 823 EmitOperand(dst, src);
823 } 824 }
824 825
825 void AssemblerX86::minps(XmmRegister dst, XmmRegister src) { 826 void AssemblerX8632::minps(XmmRegister dst, XmmRegister src) {
826 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 827 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
827 EmitUint8(0x0F); 828 EmitUint8(0x0F);
828 EmitUint8(0x5D); 829 EmitUint8(0x5D);
829 EmitXmmRegisterOperand(dst, src); 830 EmitXmmRegisterOperand(dst, src);
830 } 831 }
831 832
832 void AssemblerX86::maxps(XmmRegister dst, XmmRegister src) { 833 void AssemblerX8632::maxps(XmmRegister dst, XmmRegister src) {
833 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 834 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
834 EmitUint8(0x0F); 835 EmitUint8(0x0F);
835 EmitUint8(0x5F); 836 EmitUint8(0x5F);
836 EmitXmmRegisterOperand(dst, src); 837 EmitXmmRegisterOperand(dst, src);
837 } 838 }
838 839
839 void AssemblerX86::andps(XmmRegister dst, XmmRegister src) { 840 void AssemblerX8632::andps(XmmRegister dst, XmmRegister src) {
840 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 841 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
841 EmitUint8(0x0F); 842 EmitUint8(0x0F);
842 EmitUint8(0x54); 843 EmitUint8(0x54);
843 EmitXmmRegisterOperand(dst, src); 844 EmitXmmRegisterOperand(dst, src);
844 } 845 }
845 846
846 void AssemblerX86::andps(XmmRegister dst, const Address &src) { 847 void AssemblerX8632::andps(XmmRegister dst, const Address &src) {
847 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 848 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
848 EmitUint8(0x0F); 849 EmitUint8(0x0F);
849 EmitUint8(0x54); 850 EmitUint8(0x54);
850 EmitOperand(dst, src); 851 EmitOperand(dst, src);
851 } 852 }
852 853
853 void AssemblerX86::orps(XmmRegister dst, XmmRegister src) { 854 void AssemblerX8632::orps(XmmRegister dst, XmmRegister src) {
854 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 855 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
855 EmitUint8(0x0F); 856 EmitUint8(0x0F);
856 EmitUint8(0x56); 857 EmitUint8(0x56);
857 EmitXmmRegisterOperand(dst, src); 858 EmitXmmRegisterOperand(dst, src);
858 } 859 }
859 860
860 void AssemblerX86::blendvps(Type /* Ty */, XmmRegister dst, XmmRegister src) { 861 void AssemblerX8632::blendvps(Type /* Ty */, XmmRegister dst, XmmRegister src) {
861 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 862 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
862 EmitUint8(0x66); 863 EmitUint8(0x66);
863 EmitUint8(0x0F); 864 EmitUint8(0x0F);
864 EmitUint8(0x38); 865 EmitUint8(0x38);
865 EmitUint8(0x14); 866 EmitUint8(0x14);
866 EmitXmmRegisterOperand(dst, src); 867 EmitXmmRegisterOperand(dst, src);
867 } 868 }
868 869
869 void AssemblerX86::blendvps(Type /* Ty */, XmmRegister dst, 870 void AssemblerX8632::blendvps(Type /* Ty */, XmmRegister dst,
870 const Address &src) { 871 const Address &src) {
871 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 872 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
872 EmitUint8(0x66); 873 EmitUint8(0x66);
873 EmitUint8(0x0F); 874 EmitUint8(0x0F);
874 EmitUint8(0x38); 875 EmitUint8(0x38);
875 EmitUint8(0x14); 876 EmitUint8(0x14);
876 EmitOperand(dst, src); 877 EmitOperand(dst, src);
877 } 878 }
878 879
879 void AssemblerX86::pblendvb(Type /* Ty */, XmmRegister dst, XmmRegister src) { 880 void AssemblerX8632::pblendvb(Type /* Ty */, XmmRegister dst, XmmRegister src) {
880 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 881 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
881 EmitUint8(0x66); 882 EmitUint8(0x66);
882 EmitUint8(0x0F); 883 EmitUint8(0x0F);
883 EmitUint8(0x38); 884 EmitUint8(0x38);
884 EmitUint8(0x10); 885 EmitUint8(0x10);
885 EmitXmmRegisterOperand(dst, src); 886 EmitXmmRegisterOperand(dst, src);
886 } 887 }
887 888
888 void AssemblerX86::pblendvb(Type /* Ty */, XmmRegister dst, 889 void AssemblerX8632::pblendvb(Type /* Ty */, XmmRegister dst,
889 const Address &src) { 890 const Address &src) {
890 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 891 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
891 EmitUint8(0x66); 892 EmitUint8(0x66);
892 EmitUint8(0x0F); 893 EmitUint8(0x0F);
893 EmitUint8(0x38); 894 EmitUint8(0x38);
894 EmitUint8(0x10); 895 EmitUint8(0x10);
895 EmitOperand(dst, src); 896 EmitOperand(dst, src);
896 } 897 }
897 898
898 void AssemblerX86::cmpps(XmmRegister dst, XmmRegister src, 899 void AssemblerX8632::cmpps(XmmRegister dst, XmmRegister src,
899 CondX86::CmppsCond CmpCondition) { 900 CondX86::CmppsCond CmpCondition) {
900 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 901 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
901 EmitUint8(0x0F); 902 EmitUint8(0x0F);
902 EmitUint8(0xC2); 903 EmitUint8(0xC2);
903 EmitXmmRegisterOperand(dst, src); 904 EmitXmmRegisterOperand(dst, src);
904 EmitUint8(CmpCondition); 905 EmitUint8(CmpCondition);
905 } 906 }
906 907
907 void AssemblerX86::cmpps(XmmRegister dst, const Address &src, 908 void AssemblerX8632::cmpps(XmmRegister dst, const Address &src,
908 CondX86::CmppsCond CmpCondition) { 909 CondX86::CmppsCond CmpCondition) {
909 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 910 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
910 EmitUint8(0x0F); 911 EmitUint8(0x0F);
911 EmitUint8(0xC2); 912 EmitUint8(0xC2);
912 EmitOperand(dst, src); 913 EmitOperand(dst, src);
913 EmitUint8(CmpCondition); 914 EmitUint8(CmpCondition);
914 } 915 }
915 916
916 void AssemblerX86::sqrtps(XmmRegister dst) { 917 void AssemblerX8632::sqrtps(XmmRegister dst) {
917 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 918 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
918 EmitUint8(0x0F); 919 EmitUint8(0x0F);
919 EmitUint8(0x51); 920 EmitUint8(0x51);
920 EmitXmmRegisterOperand(dst, dst); 921 EmitXmmRegisterOperand(dst, dst);
921 } 922 }
922 923
923 void AssemblerX86::rsqrtps(XmmRegister dst) { 924 void AssemblerX8632::rsqrtps(XmmRegister dst) {
924 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 925 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
925 EmitUint8(0x0F); 926 EmitUint8(0x0F);
926 EmitUint8(0x52); 927 EmitUint8(0x52);
927 EmitXmmRegisterOperand(dst, dst); 928 EmitXmmRegisterOperand(dst, dst);
928 } 929 }
929 930
930 void AssemblerX86::reciprocalps(XmmRegister dst) { 931 void AssemblerX8632::reciprocalps(XmmRegister dst) {
931 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 932 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
932 EmitUint8(0x0F); 933 EmitUint8(0x0F);
933 EmitUint8(0x53); 934 EmitUint8(0x53);
934 EmitXmmRegisterOperand(dst, dst); 935 EmitXmmRegisterOperand(dst, dst);
935 } 936 }
936 937
937 void AssemblerX86::movhlps(XmmRegister dst, XmmRegister src) { 938 void AssemblerX8632::movhlps(XmmRegister dst, XmmRegister src) {
938 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 939 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
939 EmitUint8(0x0F); 940 EmitUint8(0x0F);
940 EmitUint8(0x12); 941 EmitUint8(0x12);
941 EmitXmmRegisterOperand(dst, src); 942 EmitXmmRegisterOperand(dst, src);
942 } 943 }
943 944
944 void AssemblerX86::movlhps(XmmRegister dst, XmmRegister src) { 945 void AssemblerX8632::movlhps(XmmRegister dst, XmmRegister src) {
945 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 946 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
946 EmitUint8(0x0F); 947 EmitUint8(0x0F);
947 EmitUint8(0x16); 948 EmitUint8(0x16);
948 EmitXmmRegisterOperand(dst, src); 949 EmitXmmRegisterOperand(dst, src);
949 } 950 }
950 951
951 void AssemblerX86::unpcklps(XmmRegister dst, XmmRegister src) { 952 void AssemblerX8632::unpcklps(XmmRegister dst, XmmRegister src) {
952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 953 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
953 EmitUint8(0x0F); 954 EmitUint8(0x0F);
954 EmitUint8(0x14); 955 EmitUint8(0x14);
955 EmitXmmRegisterOperand(dst, src); 956 EmitXmmRegisterOperand(dst, src);
956 } 957 }
957 958
958 void AssemblerX86::unpckhps(XmmRegister dst, XmmRegister src) { 959 void AssemblerX8632::unpckhps(XmmRegister dst, XmmRegister src) {
959 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 960 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
960 EmitUint8(0x0F); 961 EmitUint8(0x0F);
961 EmitUint8(0x15); 962 EmitUint8(0x15);
962 EmitXmmRegisterOperand(dst, src); 963 EmitXmmRegisterOperand(dst, src);
963 } 964 }
964 965
965 void AssemblerX86::unpcklpd(XmmRegister dst, XmmRegister src) { 966 void AssemblerX8632::unpcklpd(XmmRegister dst, XmmRegister src) {
966 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 967 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
967 EmitUint8(0x66); 968 EmitUint8(0x66);
968 EmitUint8(0x0F); 969 EmitUint8(0x0F);
969 EmitUint8(0x14); 970 EmitUint8(0x14);
970 EmitXmmRegisterOperand(dst, src); 971 EmitXmmRegisterOperand(dst, src);
971 } 972 }
972 973
973 void AssemblerX86::unpckhpd(XmmRegister dst, XmmRegister src) { 974 void AssemblerX8632::unpckhpd(XmmRegister dst, XmmRegister src) {
974 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 975 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
975 EmitUint8(0x66); 976 EmitUint8(0x66);
976 EmitUint8(0x0F); 977 EmitUint8(0x0F);
977 EmitUint8(0x15); 978 EmitUint8(0x15);
978 EmitXmmRegisterOperand(dst, src); 979 EmitXmmRegisterOperand(dst, src);
979 } 980 }
980 981
981 void AssemblerX86::set1ps(XmmRegister dst, GPRRegister tmp1, 982 void AssemblerX8632::set1ps(XmmRegister dst, GPRRegister tmp1,
982 const Immediate &imm) { 983 const Immediate &imm) {
983 // Load 32-bit immediate value into tmp1. 984 // Load 32-bit immediate value into tmp1.
984 mov(IceType_i32, tmp1, imm); 985 mov(IceType_i32, tmp1, imm);
985 // Move value from tmp1 into dst. 986 // Move value from tmp1 into dst.
986 movd(dst, tmp1); 987 movd(dst, tmp1);
987 // Broadcast low lane into other three lanes. 988 // Broadcast low lane into other three lanes.
988 shufps(dst, dst, Immediate(0x0)); 989 shufps(dst, dst, Immediate(0x0));
989 } 990 }
990 991
991 void AssemblerX86::shufps(XmmRegister dst, XmmRegister src, 992 void AssemblerX8632::shufps(XmmRegister dst, XmmRegister src,
992 const Immediate &imm) { 993 const Immediate &imm) {
993 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 994 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
994 EmitUint8(0x0F); 995 EmitUint8(0x0F);
995 EmitUint8(0xC6); 996 EmitUint8(0xC6);
996 EmitXmmRegisterOperand(dst, src); 997 EmitXmmRegisterOperand(dst, src);
997 assert(imm.is_uint8()); 998 assert(imm.is_uint8());
998 EmitUint8(imm.value()); 999 EmitUint8(imm.value());
999 } 1000 }
1000 1001
1001 void AssemblerX86::pshufd(Type /* Ty */, XmmRegister dst, XmmRegister src, 1002 void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, XmmRegister src,
1002 const Immediate &imm) { 1003 const Immediate &imm) {
1003 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1004 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1004 EmitUint8(0x66); 1005 EmitUint8(0x66);
1005 EmitUint8(0x0F); 1006 EmitUint8(0x0F);
1006 EmitUint8(0x70); 1007 EmitUint8(0x70);
1007 EmitXmmRegisterOperand(dst, src); 1008 EmitXmmRegisterOperand(dst, src);
1008 assert(imm.is_uint8()); 1009 assert(imm.is_uint8());
1009 EmitUint8(imm.value()); 1010 EmitUint8(imm.value());
1010 } 1011 }
1011 1012
1012 void AssemblerX86::pshufd(Type /* Ty */, XmmRegister dst, const Address &src, 1013 void AssemblerX8632::pshufd(Type /* Ty */, XmmRegister dst, const Address &src,
1013 const Immediate &imm) { 1014 const Immediate &imm) {
1014 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1015 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1015 EmitUint8(0x66); 1016 EmitUint8(0x66);
1016 EmitUint8(0x0F); 1017 EmitUint8(0x0F);
1017 EmitUint8(0x70); 1018 EmitUint8(0x70);
1018 EmitOperand(dst, src); 1019 EmitOperand(dst, src);
1019 assert(imm.is_uint8()); 1020 assert(imm.is_uint8());
1020 EmitUint8(imm.value()); 1021 EmitUint8(imm.value());
1021 } 1022 }
1022 1023
1023 void AssemblerX86::shufps(Type /* Ty */, XmmRegister dst, XmmRegister src, 1024 void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, XmmRegister src,
1024 const Immediate &imm) { 1025 const Immediate &imm) {
1025 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1026 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1026 EmitUint8(0x0F); 1027 EmitUint8(0x0F);
1027 EmitUint8(0xC6); 1028 EmitUint8(0xC6);
1028 EmitXmmRegisterOperand(dst, src); 1029 EmitXmmRegisterOperand(dst, src);
1029 assert(imm.is_uint8()); 1030 assert(imm.is_uint8());
1030 EmitUint8(imm.value()); 1031 EmitUint8(imm.value());
1031 } 1032 }
1032 1033
1033 void AssemblerX86::shufps(Type /* Ty */, XmmRegister dst, const Address &src, 1034 void AssemblerX8632::shufps(Type /* Ty */, XmmRegister dst, const Address &src,
1034 const Immediate &imm) { 1035 const Immediate &imm) {
1035 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1036 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1036 EmitUint8(0x0F); 1037 EmitUint8(0x0F);
1037 EmitUint8(0xC6); 1038 EmitUint8(0xC6);
1038 EmitOperand(dst, src); 1039 EmitOperand(dst, src);
1039 assert(imm.is_uint8()); 1040 assert(imm.is_uint8());
1040 EmitUint8(imm.value()); 1041 EmitUint8(imm.value());
1041 } 1042 }
1042 1043
1043 void AssemblerX86::minpd(XmmRegister dst, XmmRegister src) { 1044 void AssemblerX8632::minpd(XmmRegister dst, XmmRegister src) {
1044 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1045 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1045 EmitUint8(0x66); 1046 EmitUint8(0x66);
1046 EmitUint8(0x0F); 1047 EmitUint8(0x0F);
1047 EmitUint8(0x5D); 1048 EmitUint8(0x5D);
1048 EmitXmmRegisterOperand(dst, src); 1049 EmitXmmRegisterOperand(dst, src);
1049 } 1050 }
1050 1051
1051 void AssemblerX86::maxpd(XmmRegister dst, XmmRegister src) { 1052 void AssemblerX8632::maxpd(XmmRegister dst, XmmRegister src) {
1052 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1053 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1053 EmitUint8(0x66); 1054 EmitUint8(0x66);
1054 EmitUint8(0x0F); 1055 EmitUint8(0x0F);
1055 EmitUint8(0x5F); 1056 EmitUint8(0x5F);
1056 EmitXmmRegisterOperand(dst, src); 1057 EmitXmmRegisterOperand(dst, src);
1057 } 1058 }
1058 1059
1059 void AssemblerX86::sqrtpd(XmmRegister dst) { 1060 void AssemblerX8632::sqrtpd(XmmRegister dst) {
1060 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1061 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1061 EmitUint8(0x66); 1062 EmitUint8(0x66);
1062 EmitUint8(0x0F); 1063 EmitUint8(0x0F);
1063 EmitUint8(0x51); 1064 EmitUint8(0x51);
1064 EmitXmmRegisterOperand(dst, dst); 1065 EmitXmmRegisterOperand(dst, dst);
1065 } 1066 }
1066 1067
1067 void AssemblerX86::shufpd(XmmRegister dst, XmmRegister src, 1068 void AssemblerX8632::shufpd(XmmRegister dst, XmmRegister src,
1068 const Immediate &imm) { 1069 const Immediate &imm) {
1069 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1070 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1070 EmitUint8(0x66); 1071 EmitUint8(0x66);
1071 EmitUint8(0x0F); 1072 EmitUint8(0x0F);
1072 EmitUint8(0xC6); 1073 EmitUint8(0xC6);
1073 EmitXmmRegisterOperand(dst, src); 1074 EmitXmmRegisterOperand(dst, src);
1074 assert(imm.is_uint8()); 1075 assert(imm.is_uint8());
1075 EmitUint8(imm.value()); 1076 EmitUint8(imm.value());
1076 } 1077 }
1077 1078
1078 void AssemblerX86::cvtdq2ps(Type /* Ignore */, XmmRegister dst, 1079 void AssemblerX8632::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1079 XmmRegister src) { 1080 XmmRegister src) {
1080 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1081 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1081 EmitUint8(0x0F); 1082 EmitUint8(0x0F);
1082 EmitUint8(0x5B); 1083 EmitUint8(0x5B);
1083 EmitXmmRegisterOperand(dst, src); 1084 EmitXmmRegisterOperand(dst, src);
1084 } 1085 }
1085 1086
1086 void AssemblerX86::cvtdq2ps(Type /* Ignore */, XmmRegister dst, 1087 void AssemblerX8632::cvtdq2ps(Type /* Ignore */, XmmRegister dst,
1087 const Address &src) { 1088 const Address &src) {
1088 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1089 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1089 EmitUint8(0x0F); 1090 EmitUint8(0x0F);
1090 EmitUint8(0x5B); 1091 EmitUint8(0x5B);
1091 EmitOperand(dst, src); 1092 EmitOperand(dst, src);
1092 } 1093 }
1093 1094
1094 void AssemblerX86::cvttps2dq(Type /* Ignore */, XmmRegister dst, 1095 void AssemblerX8632::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1095 XmmRegister src) { 1096 XmmRegister src) {
1096 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1097 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1097 EmitUint8(0xF3); 1098 EmitUint8(0xF3);
1098 EmitUint8(0x0F); 1099 EmitUint8(0x0F);
1099 EmitUint8(0x5B); 1100 EmitUint8(0x5B);
1100 EmitXmmRegisterOperand(dst, src); 1101 EmitXmmRegisterOperand(dst, src);
1101 } 1102 }
1102 1103
1103 void AssemblerX86::cvttps2dq(Type /* Ignore */, XmmRegister dst, 1104 void AssemblerX8632::cvttps2dq(Type /* Ignore */, XmmRegister dst,
1104 const Address &src) { 1105 const Address &src) {
1105 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1106 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1106 EmitUint8(0xF3); 1107 EmitUint8(0xF3);
1107 EmitUint8(0x0F); 1108 EmitUint8(0x0F);
1108 EmitUint8(0x5B); 1109 EmitUint8(0x5B);
1109 EmitOperand(dst, src); 1110 EmitOperand(dst, src);
1110 } 1111 }
1111 1112
1112 void AssemblerX86::cvtsi2ss(Type DestTy, XmmRegister dst, GPRRegister src) { 1113 void AssemblerX8632::cvtsi2ss(Type DestTy, XmmRegister dst, GPRRegister src) {
1113 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1114 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1114 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1115 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1115 EmitUint8(0x0F); 1116 EmitUint8(0x0F);
1116 EmitUint8(0x2A); 1117 EmitUint8(0x2A);
1117 EmitRegisterOperand(dst, src); 1118 EmitRegisterOperand(dst, src);
1118 } 1119 }
1119 1120
1120 void AssemblerX86::cvtsi2ss(Type DestTy, XmmRegister dst, const Address &src) { 1121 void AssemblerX8632::cvtsi2ss(Type DestTy, XmmRegister dst,
1122 const Address &src) {
1121 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1123 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1122 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1124 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1123 EmitUint8(0x0F); 1125 EmitUint8(0x0F);
1124 EmitUint8(0x2A); 1126 EmitUint8(0x2A);
1125 EmitOperand(dst, src); 1127 EmitOperand(dst, src);
1126 } 1128 }
1127 1129
1128 void AssemblerX86::cvtfloat2float(Type SrcTy, XmmRegister dst, 1130 void AssemblerX8632::cvtfloat2float(Type SrcTy, XmmRegister dst,
1129 XmmRegister src) { 1131 XmmRegister src) {
1130 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1132 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1131 // ss2sd or sd2ss 1133 // ss2sd or sd2ss
1132 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1134 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1133 EmitUint8(0x0F); 1135 EmitUint8(0x0F);
1134 EmitUint8(0x5A); 1136 EmitUint8(0x5A);
1135 EmitXmmRegisterOperand(dst, src); 1137 EmitXmmRegisterOperand(dst, src);
1136 } 1138 }
1137 1139
1138 void AssemblerX86::cvtfloat2float(Type SrcTy, XmmRegister dst, 1140 void AssemblerX8632::cvtfloat2float(Type SrcTy, XmmRegister dst,
1139 const Address &src) { 1141 const Address &src) {
1140 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1142 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1141 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1143 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1142 EmitUint8(0x0F); 1144 EmitUint8(0x0F);
1143 EmitUint8(0x5A); 1145 EmitUint8(0x5A);
1144 EmitOperand(dst, src); 1146 EmitOperand(dst, src);
1145 } 1147 }
1146 1148
1147 void AssemblerX86::cvttss2si(Type SrcTy, GPRRegister dst, XmmRegister src) { 1149 void AssemblerX8632::cvttss2si(Type SrcTy, GPRRegister dst, XmmRegister src) {
1148 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1150 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1149 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1151 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1150 EmitUint8(0x0F); 1152 EmitUint8(0x0F);
1151 EmitUint8(0x2C); 1153 EmitUint8(0x2C);
1152 EmitXmmRegisterOperand(dst, src); 1154 EmitXmmRegisterOperand(dst, src);
1153 } 1155 }
1154 1156
1155 void AssemblerX86::cvttss2si(Type SrcTy, GPRRegister dst, const Address &src) { 1157 void AssemblerX8632::cvttss2si(Type SrcTy, GPRRegister dst,
1158 const Address &src) {
1156 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1159 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1157 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1160 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1158 EmitUint8(0x0F); 1161 EmitUint8(0x0F);
1159 EmitUint8(0x2C); 1162 EmitUint8(0x2C);
1160 EmitOperand(dst, src); 1163 EmitOperand(dst, src);
1161 } 1164 }
1162 1165
1163 void AssemblerX86::ucomiss(Type Ty, XmmRegister a, XmmRegister b) { 1166 void AssemblerX8632::ucomiss(Type Ty, XmmRegister a, XmmRegister b) {
1164 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1167 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1165 if (Ty == IceType_f64) 1168 if (Ty == IceType_f64)
1166 EmitUint8(0x66); 1169 EmitUint8(0x66);
1167 EmitUint8(0x0F); 1170 EmitUint8(0x0F);
1168 EmitUint8(0x2E); 1171 EmitUint8(0x2E);
1169 EmitXmmRegisterOperand(a, b); 1172 EmitXmmRegisterOperand(a, b);
1170 } 1173 }
1171 1174
1172 void AssemblerX86::ucomiss(Type Ty, XmmRegister a, const Address &b) { 1175 void AssemblerX8632::ucomiss(Type Ty, XmmRegister a, const Address &b) {
1173 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1176 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1174 if (Ty == IceType_f64) 1177 if (Ty == IceType_f64)
1175 EmitUint8(0x66); 1178 EmitUint8(0x66);
1176 EmitUint8(0x0F); 1179 EmitUint8(0x0F);
1177 EmitUint8(0x2E); 1180 EmitUint8(0x2E);
1178 EmitOperand(a, b); 1181 EmitOperand(a, b);
1179 } 1182 }
1180 1183
1181 void AssemblerX86::movmskpd(GPRRegister dst, XmmRegister src) { 1184 void AssemblerX8632::movmskpd(GPRRegister dst, XmmRegister src) {
1182 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1185 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1183 EmitUint8(0x66); 1186 EmitUint8(0x66);
1184 EmitUint8(0x0F); 1187 EmitUint8(0x0F);
1185 EmitUint8(0x50); 1188 EmitUint8(0x50);
1186 EmitXmmRegisterOperand(dst, src); 1189 EmitXmmRegisterOperand(dst, src);
1187 } 1190 }
1188 1191
1189 void AssemblerX86::movmskps(GPRRegister dst, XmmRegister src) { 1192 void AssemblerX8632::movmskps(GPRRegister dst, XmmRegister src) {
1190 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1193 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1191 EmitUint8(0x0F); 1194 EmitUint8(0x0F);
1192 EmitUint8(0x50); 1195 EmitUint8(0x50);
1193 EmitXmmRegisterOperand(dst, src); 1196 EmitXmmRegisterOperand(dst, src);
1194 } 1197 }
1195 1198
1196 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, const Address &src) { 1199 void AssemblerX8632::sqrtss(Type Ty, XmmRegister dst, const Address &src) {
1197 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1200 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1198 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1201 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1199 EmitUint8(0x0F); 1202 EmitUint8(0x0F);
1200 EmitUint8(0x51); 1203 EmitUint8(0x51);
1201 EmitOperand(dst, src); 1204 EmitOperand(dst, src);
1202 } 1205 }
1203 1206
1204 void AssemblerX86::sqrtss(Type Ty, XmmRegister dst, XmmRegister src) { 1207 void AssemblerX8632::sqrtss(Type Ty, XmmRegister dst, XmmRegister src) {
1205 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1208 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1206 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1209 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1207 EmitUint8(0x0F); 1210 EmitUint8(0x0F);
1208 EmitUint8(0x51); 1211 EmitUint8(0x51);
1209 EmitXmmRegisterOperand(dst, src); 1212 EmitXmmRegisterOperand(dst, src);
1210 } 1213 }
1211 1214
1212 void AssemblerX86::xorpd(XmmRegister dst, const Address &src) { 1215 void AssemblerX8632::xorpd(XmmRegister dst, const Address &src) {
1213 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1216 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1214 EmitUint8(0x66); 1217 EmitUint8(0x66);
1215 EmitUint8(0x0F); 1218 EmitUint8(0x0F);
1216 EmitUint8(0x57); 1219 EmitUint8(0x57);
1217 EmitOperand(dst, src); 1220 EmitOperand(dst, src);
1218 } 1221 }
1219 1222
1220 void AssemblerX86::xorpd(XmmRegister dst, XmmRegister src) { 1223 void AssemblerX8632::xorpd(XmmRegister dst, XmmRegister src) {
1221 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1224 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1222 EmitUint8(0x66); 1225 EmitUint8(0x66);
1223 EmitUint8(0x0F); 1226 EmitUint8(0x0F);
1224 EmitUint8(0x57); 1227 EmitUint8(0x57);
1225 EmitXmmRegisterOperand(dst, src); 1228 EmitXmmRegisterOperand(dst, src);
1226 } 1229 }
1227 1230
1228 void AssemblerX86::orpd(XmmRegister dst, XmmRegister src) { 1231 void AssemblerX8632::orpd(XmmRegister dst, XmmRegister src) {
1229 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1232 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1230 EmitUint8(0x66); 1233 EmitUint8(0x66);
1231 EmitUint8(0x0F); 1234 EmitUint8(0x0F);
1232 EmitUint8(0x56); 1235 EmitUint8(0x56);
1233 EmitXmmRegisterOperand(dst, src); 1236 EmitXmmRegisterOperand(dst, src);
1234 } 1237 }
1235 1238
1236 void AssemblerX86::xorps(XmmRegister dst, const Address &src) { 1239 void AssemblerX8632::xorps(XmmRegister dst, const Address &src) {
1237 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1240 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1238 EmitUint8(0x0F); 1241 EmitUint8(0x0F);
1239 EmitUint8(0x57); 1242 EmitUint8(0x57);
1240 EmitOperand(dst, src); 1243 EmitOperand(dst, src);
1241 } 1244 }
1242 1245
1243 void AssemblerX86::xorps(XmmRegister dst, XmmRegister src) { 1246 void AssemblerX8632::xorps(XmmRegister dst, XmmRegister src) {
1244 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1247 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1245 EmitUint8(0x0F); 1248 EmitUint8(0x0F);
1246 EmitUint8(0x57); 1249 EmitUint8(0x57);
1247 EmitXmmRegisterOperand(dst, src); 1250 EmitXmmRegisterOperand(dst, src);
1248 } 1251 }
1249 1252
1250 void AssemblerX86::andpd(XmmRegister dst, const Address &src) { 1253 void AssemblerX8632::andpd(XmmRegister dst, const Address &src) {
1251 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1254 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1252 EmitUint8(0x66); 1255 EmitUint8(0x66);
1253 EmitUint8(0x0F); 1256 EmitUint8(0x0F);
1254 EmitUint8(0x54); 1257 EmitUint8(0x54);
1255 EmitOperand(dst, src); 1258 EmitOperand(dst, src);
1256 } 1259 }
1257 1260
1258 void AssemblerX86::andpd(XmmRegister dst, XmmRegister src) { 1261 void AssemblerX8632::andpd(XmmRegister dst, XmmRegister src) {
1259 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1262 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1260 EmitUint8(0x66); 1263 EmitUint8(0x66);
1261 EmitUint8(0x0F); 1264 EmitUint8(0x0F);
1262 EmitUint8(0x54); 1265 EmitUint8(0x54);
1263 EmitXmmRegisterOperand(dst, src); 1266 EmitXmmRegisterOperand(dst, src);
1264 } 1267 }
1265 1268
1266 void AssemblerX86::insertps(Type Ty, XmmRegister dst, XmmRegister src, 1269 void AssemblerX8632::insertps(Type Ty, XmmRegister dst, XmmRegister src,
1267 const Immediate &imm) { 1270 const Immediate &imm) {
1268 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1271 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1269 assert(imm.is_uint8()); 1272 assert(imm.is_uint8());
1270 assert(isVectorFloatingType(Ty)); 1273 assert(isVectorFloatingType(Ty));
1271 (void)Ty; 1274 (void)Ty;
1272 EmitUint8(0x66); 1275 EmitUint8(0x66);
1273 EmitUint8(0x0F); 1276 EmitUint8(0x0F);
1274 EmitUint8(0x3A); 1277 EmitUint8(0x3A);
1275 EmitUint8(0x21); 1278 EmitUint8(0x21);
1276 EmitXmmRegisterOperand(dst, src); 1279 EmitXmmRegisterOperand(dst, src);
1277 EmitUint8(imm.value()); 1280 EmitUint8(imm.value());
1278 } 1281 }
1279 1282
1280 void AssemblerX86::insertps(Type Ty, XmmRegister dst, const Address &src, 1283 void AssemblerX8632::insertps(Type Ty, XmmRegister dst, const Address &src,
1281 const Immediate &imm) { 1284 const Immediate &imm) {
1282 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1285 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1283 assert(imm.is_uint8()); 1286 assert(imm.is_uint8());
1284 assert(isVectorFloatingType(Ty)); 1287 assert(isVectorFloatingType(Ty));
1285 (void)Ty; 1288 (void)Ty;
1286 EmitUint8(0x66); 1289 EmitUint8(0x66);
1287 EmitUint8(0x0F); 1290 EmitUint8(0x0F);
1288 EmitUint8(0x3A); 1291 EmitUint8(0x3A);
1289 EmitUint8(0x21); 1292 EmitUint8(0x21);
1290 EmitOperand(dst, src); 1293 EmitOperand(dst, src);
1291 EmitUint8(imm.value()); 1294 EmitUint8(imm.value());
1292 } 1295 }
1293 1296
1294 void AssemblerX86::pinsr(Type Ty, XmmRegister dst, GPRRegister src, 1297 void AssemblerX8632::pinsr(Type Ty, XmmRegister dst, GPRRegister src,
1295 const Immediate &imm) { 1298 const Immediate &imm) {
1296 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1299 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1297 assert(imm.is_uint8()); 1300 assert(imm.is_uint8());
1298 if (Ty == IceType_i16) { 1301 if (Ty == IceType_i16) {
1299 EmitUint8(0x66); 1302 EmitUint8(0x66);
1300 EmitUint8(0x0F); 1303 EmitUint8(0x0F);
1301 EmitUint8(0xC4); 1304 EmitUint8(0xC4);
1302 EmitXmmRegisterOperand(dst, XmmRegister(src)); 1305 EmitXmmRegisterOperand(dst, XmmRegister(src));
1303 EmitUint8(imm.value()); 1306 EmitUint8(imm.value());
1304 } else { 1307 } else {
1305 EmitUint8(0x66); 1308 EmitUint8(0x66);
1306 EmitUint8(0x0F); 1309 EmitUint8(0x0F);
1307 EmitUint8(0x3A); 1310 EmitUint8(0x3A);
1308 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1311 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1309 EmitXmmRegisterOperand(dst, XmmRegister(src)); 1312 EmitXmmRegisterOperand(dst, XmmRegister(src));
1310 EmitUint8(imm.value()); 1313 EmitUint8(imm.value());
1311 } 1314 }
1312 } 1315 }
1313 1316
1314 void AssemblerX86::pinsr(Type Ty, XmmRegister dst, const Address &src, 1317 void AssemblerX8632::pinsr(Type Ty, XmmRegister dst, const Address &src,
1315 const Immediate &imm) { 1318 const Immediate &imm) {
1316 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1319 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1317 assert(imm.is_uint8()); 1320 assert(imm.is_uint8());
1318 if (Ty == IceType_i16) { 1321 if (Ty == IceType_i16) {
1319 EmitUint8(0x66); 1322 EmitUint8(0x66);
1320 EmitUint8(0x0F); 1323 EmitUint8(0x0F);
1321 EmitUint8(0xC4); 1324 EmitUint8(0xC4);
1322 EmitOperand(dst, src); 1325 EmitOperand(dst, src);
1323 EmitUint8(imm.value()); 1326 EmitUint8(imm.value());
1324 } else { 1327 } else {
1325 EmitUint8(0x66); 1328 EmitUint8(0x66);
1326 EmitUint8(0x0F); 1329 EmitUint8(0x0F);
1327 EmitUint8(0x3A); 1330 EmitUint8(0x3A);
1328 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1331 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1329 EmitOperand(dst, src); 1332 EmitOperand(dst, src);
1330 EmitUint8(imm.value()); 1333 EmitUint8(imm.value());
1331 } 1334 }
1332 } 1335 }
1333 1336
1334 void AssemblerX86::pextr(Type Ty, GPRRegister dst, XmmRegister src, 1337 void AssemblerX8632::pextr(Type Ty, GPRRegister dst, XmmRegister src,
1335 const Immediate &imm) { 1338 const Immediate &imm) {
1336 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1339 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1337 assert(imm.is_uint8()); 1340 assert(imm.is_uint8());
1338 if (Ty == IceType_i16) { 1341 if (Ty == IceType_i16) {
1339 EmitUint8(0x66); 1342 EmitUint8(0x66);
1340 EmitUint8(0x0F); 1343 EmitUint8(0x0F);
1341 EmitUint8(0xC5); 1344 EmitUint8(0xC5);
1342 EmitXmmRegisterOperand(XmmRegister(dst), src); 1345 EmitXmmRegisterOperand(XmmRegister(dst), src);
1343 EmitUint8(imm.value()); 1346 EmitUint8(imm.value());
1344 } else { 1347 } else {
1345 EmitUint8(0x66); 1348 EmitUint8(0x66);
1346 EmitUint8(0x0F); 1349 EmitUint8(0x0F);
1347 EmitUint8(0x3A); 1350 EmitUint8(0x3A);
1348 EmitUint8(isByteSizedType(Ty) ? 0x14 : 0x16); 1351 EmitUint8(isByteSizedType(Ty) ? 0x14 : 0x16);
1349 // SSE 4.1 versions are "MRI" because dst can be mem, while 1352 // SSE 4.1 versions are "MRI" because dst can be mem, while
1350 // pextrw (SSE2) is RMI because dst must be reg. 1353 // pextrw (SSE2) is RMI because dst must be reg.
1351 EmitXmmRegisterOperand(src, XmmRegister(dst)); 1354 EmitXmmRegisterOperand(src, XmmRegister(dst));
1352 EmitUint8(imm.value()); 1355 EmitUint8(imm.value());
1353 } 1356 }
1354 } 1357 }
1355 1358
1356 void AssemblerX86::pmovsxdq(XmmRegister dst, XmmRegister src) { 1359 void AssemblerX8632::pmovsxdq(XmmRegister dst, XmmRegister src) {
1357 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1360 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1358 EmitUint8(0x66); 1361 EmitUint8(0x66);
1359 EmitUint8(0x0F); 1362 EmitUint8(0x0F);
1360 EmitUint8(0x38); 1363 EmitUint8(0x38);
1361 EmitUint8(0x25); 1364 EmitUint8(0x25);
1362 EmitXmmRegisterOperand(dst, src); 1365 EmitXmmRegisterOperand(dst, src);
1363 } 1366 }
1364 1367
1365 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) { 1368 void AssemblerX8632::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) {
1366 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1369 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1367 EmitUint8(0x66); 1370 EmitUint8(0x66);
1368 EmitUint8(0x0F); 1371 EmitUint8(0x0F);
1369 if (isByteSizedArithType(Ty)) { 1372 if (isByteSizedArithType(Ty)) {
1370 EmitUint8(0x74); 1373 EmitUint8(0x74);
1371 } else if (Ty == IceType_i16) { 1374 } else if (Ty == IceType_i16) {
1372 EmitUint8(0x75); 1375 EmitUint8(0x75);
1373 } else { 1376 } else {
1374 EmitUint8(0x76); 1377 EmitUint8(0x76);
1375 } 1378 }
1376 EmitXmmRegisterOperand(dst, src); 1379 EmitXmmRegisterOperand(dst, src);
1377 } 1380 }
1378 1381
1379 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, const Address &src) { 1382 void AssemblerX8632::pcmpeq(Type Ty, XmmRegister dst, const Address &src) {
1380 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1383 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1381 EmitUint8(0x66); 1384 EmitUint8(0x66);
1382 EmitUint8(0x0F); 1385 EmitUint8(0x0F);
1383 if (isByteSizedArithType(Ty)) { 1386 if (isByteSizedArithType(Ty)) {
1384 EmitUint8(0x74); 1387 EmitUint8(0x74);
1385 } else if (Ty == IceType_i16) { 1388 } else if (Ty == IceType_i16) {
1386 EmitUint8(0x75); 1389 EmitUint8(0x75);
1387 } else { 1390 } else {
1388 EmitUint8(0x76); 1391 EmitUint8(0x76);
1389 } 1392 }
1390 EmitOperand(dst, src); 1393 EmitOperand(dst, src);
1391 } 1394 }
1392 1395
1393 void AssemblerX86::pcmpgt(Type Ty, XmmRegister dst, XmmRegister src) { 1396 void AssemblerX8632::pcmpgt(Type Ty, XmmRegister dst, XmmRegister src) {
1394 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1397 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1395 EmitUint8(0x66); 1398 EmitUint8(0x66);
1396 EmitUint8(0x0F); 1399 EmitUint8(0x0F);
1397 if (isByteSizedArithType(Ty)) { 1400 if (isByteSizedArithType(Ty)) {
1398 EmitUint8(0x64); 1401 EmitUint8(0x64);
1399 } else if (Ty == IceType_i16) { 1402 } else if (Ty == IceType_i16) {
1400 EmitUint8(0x65); 1403 EmitUint8(0x65);
1401 } else { 1404 } else {
1402 EmitUint8(0x66); 1405 EmitUint8(0x66);
1403 } 1406 }
1404 EmitXmmRegisterOperand(dst, src); 1407 EmitXmmRegisterOperand(dst, src);
1405 } 1408 }
1406 1409
1407 void AssemblerX86::pcmpgt(Type Ty, XmmRegister dst, const Address &src) { 1410 void AssemblerX8632::pcmpgt(Type Ty, XmmRegister dst, const Address &src) {
1408 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1411 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1409 EmitUint8(0x66); 1412 EmitUint8(0x66);
1410 EmitUint8(0x0F); 1413 EmitUint8(0x0F);
1411 if (isByteSizedArithType(Ty)) { 1414 if (isByteSizedArithType(Ty)) {
1412 EmitUint8(0x64); 1415 EmitUint8(0x64);
1413 } else if (Ty == IceType_i16) { 1416 } else if (Ty == IceType_i16) {
1414 EmitUint8(0x65); 1417 EmitUint8(0x65);
1415 } else { 1418 } else {
1416 EmitUint8(0x66); 1419 EmitUint8(0x66);
1417 } 1420 }
1418 EmitOperand(dst, src); 1421 EmitOperand(dst, src);
1419 } 1422 }
1420 1423
1421 void AssemblerX86::roundsd(XmmRegister dst, XmmRegister src, 1424 void AssemblerX8632::roundsd(XmmRegister dst, XmmRegister src,
1422 RoundingMode mode) { 1425 RoundingMode mode) {
1423 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1426 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1424 EmitUint8(0x66); 1427 EmitUint8(0x66);
1425 EmitUint8(0x0F); 1428 EmitUint8(0x0F);
1426 EmitUint8(0x3A); 1429 EmitUint8(0x3A);
1427 EmitUint8(0x0B); 1430 EmitUint8(0x0B);
1428 EmitXmmRegisterOperand(dst, src); 1431 EmitXmmRegisterOperand(dst, src);
1429 // Mask precision exeption. 1432 // Mask precision exeption.
1430 EmitUint8(static_cast<uint8_t>(mode) | 0x8); 1433 EmitUint8(static_cast<uint8_t>(mode) | 0x8);
1431 } 1434 }
1432 1435
1433 void AssemblerX86::fnstcw(const Address &dst) { 1436 void AssemblerX8632::fnstcw(const Address &dst) {
1434 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1437 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1435 EmitUint8(0xD9); 1438 EmitUint8(0xD9);
1436 EmitOperand(7, dst); 1439 EmitOperand(7, dst);
1437 } 1440 }
1438 1441
1439 void AssemblerX86::fldcw(const Address &src) { 1442 void AssemblerX8632::fldcw(const Address &src) {
1440 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1443 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1441 EmitUint8(0xD9); 1444 EmitUint8(0xD9);
1442 EmitOperand(5, src); 1445 EmitOperand(5, src);
1443 } 1446 }
1444 1447
1445 void AssemblerX86::fistpl(const Address &dst) { 1448 void AssemblerX8632::fistpl(const Address &dst) {
1446 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1449 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1447 EmitUint8(0xDF); 1450 EmitUint8(0xDF);
1448 EmitOperand(7, dst); 1451 EmitOperand(7, dst);
1449 } 1452 }
1450 1453
1451 void AssemblerX86::fistps(const Address &dst) { 1454 void AssemblerX8632::fistps(const Address &dst) {
1452 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1455 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1453 EmitUint8(0xDB); 1456 EmitUint8(0xDB);
1454 EmitOperand(3, dst); 1457 EmitOperand(3, dst);
1455 } 1458 }
1456 1459
1457 void AssemblerX86::fildl(const Address &src) { 1460 void AssemblerX8632::fildl(const Address &src) {
1458 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1461 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1459 EmitUint8(0xDF); 1462 EmitUint8(0xDF);
1460 EmitOperand(5, src); 1463 EmitOperand(5, src);
1461 } 1464 }
1462 1465
1463 void AssemblerX86::filds(const Address &src) { 1466 void AssemblerX8632::filds(const Address &src) {
1464 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1467 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1465 EmitUint8(0xDB); 1468 EmitUint8(0xDB);
1466 EmitOperand(0, src); 1469 EmitOperand(0, src);
1467 } 1470 }
1468 1471
1469 void AssemblerX86::fincstp() { 1472 void AssemblerX8632::fincstp() {
1470 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1473 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1471 EmitUint8(0xD9); 1474 EmitUint8(0xD9);
1472 EmitUint8(0xF7); 1475 EmitUint8(0xF7);
1473 } 1476 }
1474 1477
1475 void AssemblerX86::cmp(Type Ty, GPRRegister reg, const Immediate &imm) { 1478 void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Immediate &imm) {
1476 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1479 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1477 if (isByteSizedType(Ty)) { 1480 if (isByteSizedType(Ty)) {
1478 EmitComplexI8(7, Operand(reg), imm); 1481 EmitComplexI8(7, Operand(reg), imm);
1479 return; 1482 return;
1480 } 1483 }
1481 if (Ty == IceType_i16) 1484 if (Ty == IceType_i16)
1482 EmitOperandSizeOverride(); 1485 EmitOperandSizeOverride();
1483 EmitComplex(Ty, 7, Operand(reg), imm); 1486 EmitComplex(Ty, 7, Operand(reg), imm);
1484 } 1487 }
1485 1488
1486 void AssemblerX86::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) { 1489 void AssemblerX8632::cmp(Type Ty, GPRRegister reg0, GPRRegister reg1) {
1487 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1490 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1488 if (Ty == IceType_i16) 1491 if (Ty == IceType_i16)
1489 EmitOperandSizeOverride(); 1492 EmitOperandSizeOverride();
1490 if (isByteSizedType(Ty)) 1493 if (isByteSizedType(Ty))
1491 EmitUint8(0x3A); 1494 EmitUint8(0x3A);
1492 else 1495 else
1493 EmitUint8(0x3B); 1496 EmitUint8(0x3B);
1494 EmitRegisterOperand(reg0, reg1); 1497 EmitRegisterOperand(reg0, reg1);
1495 } 1498 }
1496 1499
1497 void AssemblerX86::cmp(Type Ty, GPRRegister reg, const Address &address) { 1500 void AssemblerX8632::cmp(Type Ty, GPRRegister reg, const Address &address) {
1498 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1501 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1499 if (Ty == IceType_i16) 1502 if (Ty == IceType_i16)
1500 EmitOperandSizeOverride(); 1503 EmitOperandSizeOverride();
1501 if (isByteSizedType(Ty)) 1504 if (isByteSizedType(Ty))
1502 EmitUint8(0x3A); 1505 EmitUint8(0x3A);
1503 else 1506 else
1504 EmitUint8(0x3B); 1507 EmitUint8(0x3B);
1505 EmitOperand(reg, address); 1508 EmitOperand(reg, address);
1506 } 1509 }
1507 1510
1508 void AssemblerX86::cmp(Type Ty, const Address &address, GPRRegister reg) { 1511 void AssemblerX8632::cmp(Type Ty, const Address &address, GPRRegister reg) {
1509 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1512 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1510 if (Ty == IceType_i16) 1513 if (Ty == IceType_i16)
1511 EmitOperandSizeOverride(); 1514 EmitOperandSizeOverride();
1512 if (isByteSizedType(Ty)) 1515 if (isByteSizedType(Ty))
1513 EmitUint8(0x38); 1516 EmitUint8(0x38);
1514 else 1517 else
1515 EmitUint8(0x39); 1518 EmitUint8(0x39);
1516 EmitOperand(reg, address); 1519 EmitOperand(reg, address);
1517 } 1520 }
1518 1521
1519 void AssemblerX86::cmp(Type Ty, const Address &address, const Immediate &imm) { 1522 void AssemblerX8632::cmp(Type Ty, const Address &address,
1523 const Immediate &imm) {
1520 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1524 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1521 if (isByteSizedType(Ty)) { 1525 if (isByteSizedType(Ty)) {
1522 EmitComplexI8(7, address, imm); 1526 EmitComplexI8(7, address, imm);
1523 return; 1527 return;
1524 } 1528 }
1525 if (Ty == IceType_i16) 1529 if (Ty == IceType_i16)
1526 EmitOperandSizeOverride(); 1530 EmitOperandSizeOverride();
1527 EmitComplex(Ty, 7, address, imm); 1531 EmitComplex(Ty, 7, address, imm);
1528 } 1532 }
1529 1533
1530 void AssemblerX86::test(Type Ty, GPRRegister reg1, GPRRegister reg2) { 1534 void AssemblerX8632::test(Type Ty, GPRRegister reg1, GPRRegister reg2) {
1531 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1535 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1532 if (Ty == IceType_i16) 1536 if (Ty == IceType_i16)
1533 EmitOperandSizeOverride(); 1537 EmitOperandSizeOverride();
1534 if (isByteSizedType(Ty)) 1538 if (isByteSizedType(Ty))
1535 EmitUint8(0x84); 1539 EmitUint8(0x84);
1536 else 1540 else
1537 EmitUint8(0x85); 1541 EmitUint8(0x85);
1538 EmitRegisterOperand(reg1, reg2); 1542 EmitRegisterOperand(reg1, reg2);
1539 } 1543 }
1540 1544
1541 void AssemblerX86::test(Type Ty, const Address &addr, GPRRegister reg) { 1545 void AssemblerX8632::test(Type Ty, const Address &addr, GPRRegister reg) {
1542 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1546 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1543 if (Ty == IceType_i16) 1547 if (Ty == IceType_i16)
1544 EmitOperandSizeOverride(); 1548 EmitOperandSizeOverride();
1545 if (isByteSizedType(Ty)) 1549 if (isByteSizedType(Ty))
1546 EmitUint8(0x84); 1550 EmitUint8(0x84);
1547 else 1551 else
1548 EmitUint8(0x85); 1552 EmitUint8(0x85);
1549 EmitOperand(reg, addr); 1553 EmitOperand(reg, addr);
1550 } 1554 }
1551 1555
1552 void AssemblerX86::test(Type Ty, GPRRegister reg, const Immediate &immediate) { 1556 void AssemblerX8632::test(Type Ty, GPRRegister reg,
1557 const Immediate &immediate) {
1553 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1558 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1554 // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 1559 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
1555 // we only test the byte register to keep the encoding short. 1560 // we only test the byte register to keep the encoding short.
1556 // This is legal even if the register had high bits set since 1561 // This is legal even if the register had high bits set since
1557 // this only sets flags registers based on the "AND" of the two operands, 1562 // this only sets flags registers based on the "AND" of the two operands,
1558 // and the immediate had zeros at those high bits. 1563 // and the immediate had zeros at those high bits.
1559 if (immediate.is_uint8() && reg < 4) { 1564 if (immediate.is_uint8() && reg < 4) {
1560 // Use zero-extended 8-bit immediate. 1565 // Use zero-extended 8-bit immediate.
1561 if (reg == RegX8632::Encoded_Reg_eax) { 1566 if (reg == RegX8632::Encoded_Reg_eax) {
1562 EmitUint8(0xA8); 1567 EmitUint8(0xA8);
(...skipping 10 matching lines...) Expand all
1573 EmitImmediate(Ty, immediate); 1578 EmitImmediate(Ty, immediate);
1574 } else { 1579 } else {
1575 if (Ty == IceType_i16) 1580 if (Ty == IceType_i16)
1576 EmitOperandSizeOverride(); 1581 EmitOperandSizeOverride();
1577 EmitUint8(0xF7); 1582 EmitUint8(0xF7);
1578 EmitRegisterOperand(0, reg); 1583 EmitRegisterOperand(0, reg);
1579 EmitImmediate(Ty, immediate); 1584 EmitImmediate(Ty, immediate);
1580 } 1585 }
1581 } 1586 }
1582 1587
1583 void AssemblerX86::test(Type Ty, const Address &addr, 1588 void AssemblerX8632::test(Type Ty, const Address &addr,
1584 const Immediate &immediate) { 1589 const Immediate &immediate) {
1585 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1590 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1586 // If the immediate is short, we only test the byte addr to keep the 1591 // If the immediate is short, we only test the byte addr to keep the
1587 // encoding short. 1592 // encoding short.
1588 if (immediate.is_uint8()) { 1593 if (immediate.is_uint8()) {
1589 // Use zero-extended 8-bit immediate. 1594 // Use zero-extended 8-bit immediate.
1590 EmitUint8(0xF6); 1595 EmitUint8(0xF6);
1591 EmitOperand(0, addr); 1596 EmitOperand(0, addr);
1592 EmitUint8(immediate.value() & 0xFF); 1597 EmitUint8(immediate.value() & 0xFF);
1593 } else { 1598 } else {
1594 if (Ty == IceType_i16) 1599 if (Ty == IceType_i16)
1595 EmitOperandSizeOverride(); 1600 EmitOperandSizeOverride();
1596 EmitUint8(0xF7); 1601 EmitUint8(0xF7);
1597 EmitOperand(0, addr); 1602 EmitOperand(0, addr);
1598 EmitImmediate(Ty, immediate); 1603 EmitImmediate(Ty, immediate);
1599 } 1604 }
1600 } 1605 }
1601 1606
1602 void AssemblerX86::And(Type Ty, GPRRegister dst, GPRRegister src) { 1607 void AssemblerX8632::And(Type Ty, GPRRegister dst, GPRRegister src) {
1603 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1608 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1604 if (Ty == IceType_i16) 1609 if (Ty == IceType_i16)
1605 EmitOperandSizeOverride(); 1610 EmitOperandSizeOverride();
1606 if (isByteSizedType(Ty)) 1611 if (isByteSizedType(Ty))
1607 EmitUint8(0x22); 1612 EmitUint8(0x22);
1608 else 1613 else
1609 EmitUint8(0x23); 1614 EmitUint8(0x23);
1610 EmitRegisterOperand(dst, src); 1615 EmitRegisterOperand(dst, src);
1611 } 1616 }
1612 1617
1613 void AssemblerX86::And(Type Ty, GPRRegister dst, const Address &address) { 1618 void AssemblerX8632::And(Type Ty, GPRRegister dst, const Address &address) {
1614 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1619 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1615 if (Ty == IceType_i16) 1620 if (Ty == IceType_i16)
1616 EmitOperandSizeOverride(); 1621 EmitOperandSizeOverride();
1617 if (isByteSizedType(Ty)) 1622 if (isByteSizedType(Ty))
1618 EmitUint8(0x22); 1623 EmitUint8(0x22);
1619 else 1624 else
1620 EmitUint8(0x23); 1625 EmitUint8(0x23);
1621 EmitOperand(dst, address); 1626 EmitOperand(dst, address);
1622 } 1627 }
1623 1628
1624 void AssemblerX86::And(Type Ty, GPRRegister dst, const Immediate &imm) { 1629 void AssemblerX8632::And(Type Ty, GPRRegister dst, const Immediate &imm) {
1625 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1630 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1626 if (isByteSizedType(Ty)) { 1631 if (isByteSizedType(Ty)) {
1627 EmitComplexI8(4, Operand(dst), imm); 1632 EmitComplexI8(4, Operand(dst), imm);
1628 return; 1633 return;
1629 } 1634 }
1630 if (Ty == IceType_i16) 1635 if (Ty == IceType_i16)
1631 EmitOperandSizeOverride(); 1636 EmitOperandSizeOverride();
1632 EmitComplex(Ty, 4, Operand(dst), imm); 1637 EmitComplex(Ty, 4, Operand(dst), imm);
1633 } 1638 }
1634 1639
1635 void AssemblerX86::Or(Type Ty, GPRRegister dst, GPRRegister src) { 1640 void AssemblerX8632::Or(Type Ty, GPRRegister dst, GPRRegister src) {
1636 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1641 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1637 if (Ty == IceType_i16) 1642 if (Ty == IceType_i16)
1638 EmitOperandSizeOverride(); 1643 EmitOperandSizeOverride();
1639 if (isByteSizedType(Ty)) 1644 if (isByteSizedType(Ty))
1640 EmitUint8(0x0A); 1645 EmitUint8(0x0A);
1641 else 1646 else
1642 EmitUint8(0x0B); 1647 EmitUint8(0x0B);
1643 EmitRegisterOperand(dst, src); 1648 EmitRegisterOperand(dst, src);
1644 } 1649 }
1645 1650
1646 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Address &address) { 1651 void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Address &address) {
1647 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1652 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1648 if (Ty == IceType_i16) 1653 if (Ty == IceType_i16)
1649 EmitOperandSizeOverride(); 1654 EmitOperandSizeOverride();
1650 if (isByteSizedType(Ty)) 1655 if (isByteSizedType(Ty))
1651 EmitUint8(0x0A); 1656 EmitUint8(0x0A);
1652 else 1657 else
1653 EmitUint8(0x0B); 1658 EmitUint8(0x0B);
1654 EmitOperand(dst, address); 1659 EmitOperand(dst, address);
1655 } 1660 }
1656 1661
1657 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Immediate &imm) { 1662 void AssemblerX8632::Or(Type Ty, GPRRegister dst, const Immediate &imm) {
1658 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1663 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1659 if (isByteSizedType(Ty)) { 1664 if (isByteSizedType(Ty)) {
1660 EmitComplexI8(1, Operand(dst), imm); 1665 EmitComplexI8(1, Operand(dst), imm);
1661 return; 1666 return;
1662 } 1667 }
1663 if (Ty == IceType_i16) 1668 if (Ty == IceType_i16)
1664 EmitOperandSizeOverride(); 1669 EmitOperandSizeOverride();
1665 EmitComplex(Ty, 1, Operand(dst), imm); 1670 EmitComplex(Ty, 1, Operand(dst), imm);
1666 } 1671 }
1667 1672
1668 void AssemblerX86::Xor(Type Ty, GPRRegister dst, GPRRegister src) { 1673 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, GPRRegister src) {
1669 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1674 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1670 if (Ty == IceType_i16) 1675 if (Ty == IceType_i16)
1671 EmitOperandSizeOverride(); 1676 EmitOperandSizeOverride();
1672 if (isByteSizedType(Ty)) 1677 if (isByteSizedType(Ty))
1673 EmitUint8(0x32); 1678 EmitUint8(0x32);
1674 else 1679 else
1675 EmitUint8(0x33); 1680 EmitUint8(0x33);
1676 EmitRegisterOperand(dst, src); 1681 EmitRegisterOperand(dst, src);
1677 } 1682 }
1678 1683
1679 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Address &address) { 1684 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Address &address) {
1680 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1685 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1681 if (Ty == IceType_i16) 1686 if (Ty == IceType_i16)
1682 EmitOperandSizeOverride(); 1687 EmitOperandSizeOverride();
1683 if (isByteSizedType(Ty)) 1688 if (isByteSizedType(Ty))
1684 EmitUint8(0x32); 1689 EmitUint8(0x32);
1685 else 1690 else
1686 EmitUint8(0x33); 1691 EmitUint8(0x33);
1687 EmitOperand(dst, address); 1692 EmitOperand(dst, address);
1688 } 1693 }
1689 1694
1690 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { 1695 void AssemblerX8632::Xor(Type Ty, GPRRegister dst, const Immediate &imm) {
1691 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1696 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1692 if (isByteSizedType(Ty)) { 1697 if (isByteSizedType(Ty)) {
1693 EmitComplexI8(6, Operand(dst), imm); 1698 EmitComplexI8(6, Operand(dst), imm);
1694 return; 1699 return;
1695 } 1700 }
1696 if (Ty == IceType_i16) 1701 if (Ty == IceType_i16)
1697 EmitOperandSizeOverride(); 1702 EmitOperandSizeOverride();
1698 EmitComplex(Ty, 6, Operand(dst), imm); 1703 EmitComplex(Ty, 6, Operand(dst), imm);
1699 } 1704 }
1700 1705
1701 void AssemblerX86::add(Type Ty, GPRRegister dst, GPRRegister src) { 1706 void AssemblerX8632::add(Type Ty, GPRRegister dst, GPRRegister src) {
1702 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1707 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1703 if (Ty == IceType_i16) 1708 if (Ty == IceType_i16)
1704 EmitOperandSizeOverride(); 1709 EmitOperandSizeOverride();
1705 if (isByteSizedArithType(Ty)) 1710 if (isByteSizedArithType(Ty))
1706 EmitUint8(0x02); 1711 EmitUint8(0x02);
1707 else 1712 else
1708 EmitUint8(0x03); 1713 EmitUint8(0x03);
1709 EmitRegisterOperand(dst, src); 1714 EmitRegisterOperand(dst, src);
1710 } 1715 }
1711 1716
1712 void AssemblerX86::add(Type Ty, GPRRegister reg, const Address &address) { 1717 void AssemblerX8632::add(Type Ty, GPRRegister reg, const Address &address) {
1713 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1718 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1714 if (Ty == IceType_i16) 1719 if (Ty == IceType_i16)
1715 EmitOperandSizeOverride(); 1720 EmitOperandSizeOverride();
1716 if (isByteSizedArithType(Ty)) 1721 if (isByteSizedArithType(Ty))
1717 EmitUint8(0x02); 1722 EmitUint8(0x02);
1718 else 1723 else
1719 EmitUint8(0x03); 1724 EmitUint8(0x03);
1720 EmitOperand(reg, address); 1725 EmitOperand(reg, address);
1721 } 1726 }
1722 1727
1723 void AssemblerX86::add(Type Ty, GPRRegister reg, const Immediate &imm) { 1728 void AssemblerX8632::add(Type Ty, GPRRegister reg, const Immediate &imm) {
1724 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1729 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1725 if (isByteSizedArithType(Ty)) { 1730 if (isByteSizedArithType(Ty)) {
1726 EmitComplexI8(0, Operand(reg), imm); 1731 EmitComplexI8(0, Operand(reg), imm);
1727 return; 1732 return;
1728 } 1733 }
1729 if (Ty == IceType_i16) 1734 if (Ty == IceType_i16)
1730 EmitOperandSizeOverride(); 1735 EmitOperandSizeOverride();
1731 EmitComplex(Ty, 0, Operand(reg), imm); 1736 EmitComplex(Ty, 0, Operand(reg), imm);
1732 } 1737 }
1733 1738
1734 void AssemblerX86::adc(Type Ty, GPRRegister dst, GPRRegister src) { 1739 void AssemblerX8632::adc(Type Ty, GPRRegister dst, GPRRegister src) {
1735 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1740 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1736 if (Ty == IceType_i16) 1741 if (Ty == IceType_i16)
1737 EmitOperandSizeOverride(); 1742 EmitOperandSizeOverride();
1738 if (isByteSizedArithType(Ty)) 1743 if (isByteSizedArithType(Ty))
1739 EmitUint8(0x12); 1744 EmitUint8(0x12);
1740 else 1745 else
1741 EmitUint8(0x13); 1746 EmitUint8(0x13);
1742 EmitRegisterOperand(dst, src); 1747 EmitRegisterOperand(dst, src);
1743 } 1748 }
1744 1749
1745 void AssemblerX86::adc(Type Ty, GPRRegister dst, const Address &address) { 1750 void AssemblerX8632::adc(Type Ty, GPRRegister dst, const Address &address) {
1746 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1751 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1747 if (Ty == IceType_i16) 1752 if (Ty == IceType_i16)
1748 EmitOperandSizeOverride(); 1753 EmitOperandSizeOverride();
1749 if (isByteSizedArithType(Ty)) 1754 if (isByteSizedArithType(Ty))
1750 EmitUint8(0x12); 1755 EmitUint8(0x12);
1751 else 1756 else
1752 EmitUint8(0x13); 1757 EmitUint8(0x13);
1753 EmitOperand(dst, address); 1758 EmitOperand(dst, address);
1754 } 1759 }
1755 1760
1756 void AssemblerX86::adc(Type Ty, GPRRegister reg, const Immediate &imm) { 1761 void AssemblerX8632::adc(Type Ty, GPRRegister reg, const Immediate &imm) {
1757 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1762 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1758 if (isByteSizedArithType(Ty)) { 1763 if (isByteSizedArithType(Ty)) {
1759 EmitComplexI8(2, Operand(reg), imm); 1764 EmitComplexI8(2, Operand(reg), imm);
1760 return; 1765 return;
1761 } 1766 }
1762 if (Ty == IceType_i16) 1767 if (Ty == IceType_i16)
1763 EmitOperandSizeOverride(); 1768 EmitOperandSizeOverride();
1764 EmitComplex(Ty, 2, Operand(reg), imm); 1769 EmitComplex(Ty, 2, Operand(reg), imm);
1765 } 1770 }
1766 1771
1767 void AssemblerX86::sub(Type Ty, GPRRegister dst, GPRRegister src) { 1772 void AssemblerX8632::sub(Type Ty, GPRRegister dst, GPRRegister src) {
1768 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1773 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1769 if (Ty == IceType_i16) 1774 if (Ty == IceType_i16)
1770 EmitOperandSizeOverride(); 1775 EmitOperandSizeOverride();
1771 if (isByteSizedArithType(Ty)) 1776 if (isByteSizedArithType(Ty))
1772 EmitUint8(0x2A); 1777 EmitUint8(0x2A);
1773 else 1778 else
1774 EmitUint8(0x2B); 1779 EmitUint8(0x2B);
1775 EmitRegisterOperand(dst, src); 1780 EmitRegisterOperand(dst, src);
1776 } 1781 }
1777 1782
1778 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Address &address) { 1783 void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Address &address) {
1779 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1784 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1780 if (Ty == IceType_i16) 1785 if (Ty == IceType_i16)
1781 EmitOperandSizeOverride(); 1786 EmitOperandSizeOverride();
1782 if (isByteSizedArithType(Ty)) 1787 if (isByteSizedArithType(Ty))
1783 EmitUint8(0x2A); 1788 EmitUint8(0x2A);
1784 else 1789 else
1785 EmitUint8(0x2B); 1790 EmitUint8(0x2B);
1786 EmitOperand(reg, address); 1791 EmitOperand(reg, address);
1787 } 1792 }
1788 1793
1789 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Immediate &imm) { 1794 void AssemblerX8632::sub(Type Ty, GPRRegister reg, const Immediate &imm) {
1790 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1795 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1791 if (isByteSizedArithType(Ty)) { 1796 if (isByteSizedArithType(Ty)) {
1792 EmitComplexI8(5, Operand(reg), imm); 1797 EmitComplexI8(5, Operand(reg), imm);
1793 return; 1798 return;
1794 } 1799 }
1795 if (Ty == IceType_i16) 1800 if (Ty == IceType_i16)
1796 EmitOperandSizeOverride(); 1801 EmitOperandSizeOverride();
1797 EmitComplex(Ty, 5, Operand(reg), imm); 1802 EmitComplex(Ty, 5, Operand(reg), imm);
1798 } 1803 }
1799 1804
1800 void AssemblerX86::sbb(Type Ty, GPRRegister dst, GPRRegister src) { 1805 void AssemblerX8632::sbb(Type Ty, GPRRegister dst, GPRRegister src) {
1801 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1806 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1802 if (Ty == IceType_i16) 1807 if (Ty == IceType_i16)
1803 EmitOperandSizeOverride(); 1808 EmitOperandSizeOverride();
1804 if (isByteSizedArithType(Ty)) 1809 if (isByteSizedArithType(Ty))
1805 EmitUint8(0x1A); 1810 EmitUint8(0x1A);
1806 else 1811 else
1807 EmitUint8(0x1B); 1812 EmitUint8(0x1B);
1808 EmitRegisterOperand(dst, src); 1813 EmitRegisterOperand(dst, src);
1809 } 1814 }
1810 1815
1811 void AssemblerX86::sbb(Type Ty, GPRRegister dst, const Address &address) { 1816 void AssemblerX8632::sbb(Type Ty, GPRRegister dst, const Address &address) {
1812 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1817 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1813 if (Ty == IceType_i16) 1818 if (Ty == IceType_i16)
1814 EmitOperandSizeOverride(); 1819 EmitOperandSizeOverride();
1815 if (isByteSizedArithType(Ty)) 1820 if (isByteSizedArithType(Ty))
1816 EmitUint8(0x1A); 1821 EmitUint8(0x1A);
1817 else 1822 else
1818 EmitUint8(0x1B); 1823 EmitUint8(0x1B);
1819 EmitOperand(dst, address); 1824 EmitOperand(dst, address);
1820 } 1825 }
1821 1826
1822 void AssemblerX86::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { 1827 void AssemblerX8632::sbb(Type Ty, GPRRegister reg, const Immediate &imm) {
1823 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1828 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1824 if (isByteSizedArithType(Ty)) { 1829 if (isByteSizedArithType(Ty)) {
1825 EmitComplexI8(3, Operand(reg), imm); 1830 EmitComplexI8(3, Operand(reg), imm);
1826 return; 1831 return;
1827 } 1832 }
1828 if (Ty == IceType_i16) 1833 if (Ty == IceType_i16)
1829 EmitOperandSizeOverride(); 1834 EmitOperandSizeOverride();
1830 EmitComplex(Ty, 3, Operand(reg), imm); 1835 EmitComplex(Ty, 3, Operand(reg), imm);
1831 } 1836 }
1832 1837
1833 void AssemblerX86::cbw() { 1838 void AssemblerX8632::cbw() {
1834 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1839 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1835 EmitOperandSizeOverride(); 1840 EmitOperandSizeOverride();
1836 EmitUint8(0x98); 1841 EmitUint8(0x98);
1837 } 1842 }
1838 1843
1839 void AssemblerX86::cwd() { 1844 void AssemblerX8632::cwd() {
1840 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1845 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1841 EmitOperandSizeOverride(); 1846 EmitOperandSizeOverride();
1842 EmitUint8(0x99); 1847 EmitUint8(0x99);
1843 } 1848 }
1844 1849
1845 void AssemblerX86::cdq() { 1850 void AssemblerX8632::cdq() {
1846 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1851 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1847 EmitUint8(0x99); 1852 EmitUint8(0x99);
1848 } 1853 }
1849 1854
1850 void AssemblerX86::div(Type Ty, GPRRegister reg) { 1855 void AssemblerX8632::div(Type Ty, GPRRegister reg) {
1851 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1856 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1852 if (Ty == IceType_i16) 1857 if (Ty == IceType_i16)
1853 EmitOperandSizeOverride(); 1858 EmitOperandSizeOverride();
1854 if (isByteSizedArithType(Ty)) 1859 if (isByteSizedArithType(Ty))
1855 EmitUint8(0xF6); 1860 EmitUint8(0xF6);
1856 else 1861 else
1857 EmitUint8(0xF7); 1862 EmitUint8(0xF7);
1858 EmitRegisterOperand(6, reg); 1863 EmitRegisterOperand(6, reg);
1859 } 1864 }
1860 1865
1861 void AssemblerX86::div(Type Ty, const Address &addr) { 1866 void AssemblerX8632::div(Type Ty, const Address &addr) {
1862 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1867 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1863 if (Ty == IceType_i16) 1868 if (Ty == IceType_i16)
1864 EmitOperandSizeOverride(); 1869 EmitOperandSizeOverride();
1865 if (isByteSizedArithType(Ty)) 1870 if (isByteSizedArithType(Ty))
1866 EmitUint8(0xF6); 1871 EmitUint8(0xF6);
1867 else 1872 else
1868 EmitUint8(0xF7); 1873 EmitUint8(0xF7);
1869 EmitOperand(6, addr); 1874 EmitOperand(6, addr);
1870 } 1875 }
1871 1876
1872 void AssemblerX86::idiv(Type Ty, GPRRegister reg) { 1877 void AssemblerX8632::idiv(Type Ty, GPRRegister reg) {
1873 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1878 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1874 if (Ty == IceType_i16) 1879 if (Ty == IceType_i16)
1875 EmitOperandSizeOverride(); 1880 EmitOperandSizeOverride();
1876 if (isByteSizedArithType(Ty)) 1881 if (isByteSizedArithType(Ty))
1877 EmitUint8(0xF6); 1882 EmitUint8(0xF6);
1878 else 1883 else
1879 EmitUint8(0xF7); 1884 EmitUint8(0xF7);
1880 EmitRegisterOperand(7, reg); 1885 EmitRegisterOperand(7, reg);
1881 } 1886 }
1882 1887
1883 void AssemblerX86::idiv(Type Ty, const Address &addr) { 1888 void AssemblerX8632::idiv(Type Ty, const Address &addr) {
1884 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1889 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1885 if (Ty == IceType_i16) 1890 if (Ty == IceType_i16)
1886 EmitOperandSizeOverride(); 1891 EmitOperandSizeOverride();
1887 if (isByteSizedArithType(Ty)) 1892 if (isByteSizedArithType(Ty))
1888 EmitUint8(0xF6); 1893 EmitUint8(0xF6);
1889 else 1894 else
1890 EmitUint8(0xF7); 1895 EmitUint8(0xF7);
1891 EmitOperand(7, addr); 1896 EmitOperand(7, addr);
1892 } 1897 }
1893 1898
1894 void AssemblerX86::imul(Type Ty, GPRRegister dst, GPRRegister src) { 1899 void AssemblerX8632::imul(Type Ty, GPRRegister dst, GPRRegister src) {
1895 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1900 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1896 assert(Ty == IceType_i16 || Ty == IceType_i32); 1901 assert(Ty == IceType_i16 || Ty == IceType_i32);
1897 if (Ty == IceType_i16) 1902 if (Ty == IceType_i16)
1898 EmitOperandSizeOverride(); 1903 EmitOperandSizeOverride();
1899 EmitUint8(0x0F); 1904 EmitUint8(0x0F);
1900 EmitUint8(0xAF); 1905 EmitUint8(0xAF);
1901 EmitRegisterOperand(dst, src); 1906 EmitRegisterOperand(dst, src);
1902 } 1907 }
1903 1908
1904 void AssemblerX86::imul(Type Ty, GPRRegister reg, const Address &address) { 1909 void AssemblerX8632::imul(Type Ty, GPRRegister reg, const Address &address) {
1905 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1910 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1906 assert(Ty == IceType_i16 || Ty == IceType_i32); 1911 assert(Ty == IceType_i16 || Ty == IceType_i32);
1907 if (Ty == IceType_i16) 1912 if (Ty == IceType_i16)
1908 EmitOperandSizeOverride(); 1913 EmitOperandSizeOverride();
1909 EmitUint8(0x0F); 1914 EmitUint8(0x0F);
1910 EmitUint8(0xAF); 1915 EmitUint8(0xAF);
1911 EmitOperand(reg, address); 1916 EmitOperand(reg, address);
1912 } 1917 }
1913 1918
1914 void AssemblerX86::imul(Type Ty, GPRRegister reg, const Immediate &imm) { 1919 void AssemblerX8632::imul(Type Ty, GPRRegister reg, const Immediate &imm) {
1915 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1920 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1916 assert(Ty == IceType_i16 || Ty == IceType_i32); 1921 assert(Ty == IceType_i16 || Ty == IceType_i32);
1917 if (Ty == IceType_i16) 1922 if (Ty == IceType_i16)
1918 EmitOperandSizeOverride(); 1923 EmitOperandSizeOverride();
1919 if (imm.is_int8()) { 1924 if (imm.is_int8()) {
1920 EmitUint8(0x6B); 1925 EmitUint8(0x6B);
1921 EmitRegisterOperand(reg, reg); 1926 EmitRegisterOperand(reg, reg);
1922 EmitUint8(imm.value() & 0xFF); 1927 EmitUint8(imm.value() & 0xFF);
1923 } else { 1928 } else {
1924 EmitUint8(0x69); 1929 EmitUint8(0x69);
1925 EmitRegisterOperand(reg, reg); 1930 EmitRegisterOperand(reg, reg);
1926 EmitImmediate(Ty, imm); 1931 EmitImmediate(Ty, imm);
1927 } 1932 }
1928 } 1933 }
1929 1934
1930 void AssemblerX86::imul(Type Ty, GPRRegister reg) { 1935 void AssemblerX8632::imul(Type Ty, GPRRegister reg) {
1931 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1936 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1932 if (Ty == IceType_i16) 1937 if (Ty == IceType_i16)
1933 EmitOperandSizeOverride(); 1938 EmitOperandSizeOverride();
1934 if (isByteSizedArithType(Ty)) 1939 if (isByteSizedArithType(Ty))
1935 EmitUint8(0xF6); 1940 EmitUint8(0xF6);
1936 else 1941 else
1937 EmitUint8(0xF7); 1942 EmitUint8(0xF7);
1938 EmitRegisterOperand(5, reg); 1943 EmitRegisterOperand(5, reg);
1939 } 1944 }
1940 1945
1941 void AssemblerX86::imul(Type Ty, const Address &address) { 1946 void AssemblerX8632::imul(Type Ty, const Address &address) {
1942 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1947 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1943 if (Ty == IceType_i16) 1948 if (Ty == IceType_i16)
1944 EmitOperandSizeOverride(); 1949 EmitOperandSizeOverride();
1945 if (isByteSizedArithType(Ty)) 1950 if (isByteSizedArithType(Ty))
1946 EmitUint8(0xF6); 1951 EmitUint8(0xF6);
1947 else 1952 else
1948 EmitUint8(0xF7); 1953 EmitUint8(0xF7);
1949 EmitOperand(5, address); 1954 EmitOperand(5, address);
1950 } 1955 }
1951 1956
1952 void AssemblerX86::mul(Type Ty, GPRRegister reg) { 1957 void AssemblerX8632::mul(Type Ty, GPRRegister reg) {
1953 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1958 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1954 if (Ty == IceType_i16) 1959 if (Ty == IceType_i16)
1955 EmitOperandSizeOverride(); 1960 EmitOperandSizeOverride();
1956 if (isByteSizedArithType(Ty)) 1961 if (isByteSizedArithType(Ty))
1957 EmitUint8(0xF6); 1962 EmitUint8(0xF6);
1958 else 1963 else
1959 EmitUint8(0xF7); 1964 EmitUint8(0xF7);
1960 EmitRegisterOperand(4, reg); 1965 EmitRegisterOperand(4, reg);
1961 } 1966 }
1962 1967
1963 void AssemblerX86::mul(Type Ty, const Address &address) { 1968 void AssemblerX8632::mul(Type Ty, const Address &address) {
1964 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1969 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1965 if (Ty == IceType_i16) 1970 if (Ty == IceType_i16)
1966 EmitOperandSizeOverride(); 1971 EmitOperandSizeOverride();
1967 if (isByteSizedArithType(Ty)) 1972 if (isByteSizedArithType(Ty))
1968 EmitUint8(0xF6); 1973 EmitUint8(0xF6);
1969 else 1974 else
1970 EmitUint8(0xF7); 1975 EmitUint8(0xF7);
1971 EmitOperand(4, address); 1976 EmitOperand(4, address);
1972 } 1977 }
1973 1978
1974 void AssemblerX86::incl(GPRRegister reg) { 1979 void AssemblerX8632::incl(GPRRegister reg) {
1975 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1980 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1976 EmitUint8(0x40 + reg); 1981 EmitUint8(0x40 + reg);
1977 } 1982 }
1978 1983
1979 void AssemblerX86::incl(const Address &address) { 1984 void AssemblerX8632::incl(const Address &address) {
1980 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1985 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1981 EmitUint8(0xFF); 1986 EmitUint8(0xFF);
1982 EmitOperand(0, address); 1987 EmitOperand(0, address);
1983 } 1988 }
1984 1989
1985 void AssemblerX86::decl(GPRRegister reg) { 1990 void AssemblerX8632::decl(GPRRegister reg) {
1986 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1991 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1987 EmitUint8(0x48 + reg); 1992 EmitUint8(0x48 + reg);
1988 } 1993 }
1989 1994
1990 void AssemblerX86::decl(const Address &address) { 1995 void AssemblerX8632::decl(const Address &address) {
1991 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1996 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
1992 EmitUint8(0xFF); 1997 EmitUint8(0xFF);
1993 EmitOperand(1, address); 1998 EmitOperand(1, address);
1994 } 1999 }
1995 2000
1996 void AssemblerX86::rol(Type Ty, GPRRegister reg, const Immediate &imm) { 2001 void AssemblerX8632::rol(Type Ty, GPRRegister reg, const Immediate &imm) {
1997 EmitGenericShift(0, Ty, reg, imm); 2002 EmitGenericShift(0, Ty, reg, imm);
1998 } 2003 }
1999 2004
2000 void AssemblerX86::rol(Type Ty, GPRRegister operand, GPRRegister shifter) { 2005 void AssemblerX8632::rol(Type Ty, GPRRegister operand, GPRRegister shifter) {
2001 EmitGenericShift(0, Ty, Operand(operand), shifter); 2006 EmitGenericShift(0, Ty, Operand(operand), shifter);
2002 } 2007 }
2003 2008
2004 void AssemblerX86::rol(Type Ty, const Address &operand, GPRRegister shifter) { 2009 void AssemblerX8632::rol(Type Ty, const Address &operand, GPRRegister shifter) {
2005 EmitGenericShift(0, Ty, operand, shifter); 2010 EmitGenericShift(0, Ty, operand, shifter);
2006 } 2011 }
2007 2012
2008 void AssemblerX86::shl(Type Ty, GPRRegister reg, const Immediate &imm) { 2013 void AssemblerX8632::shl(Type Ty, GPRRegister reg, const Immediate &imm) {
2009 EmitGenericShift(4, Ty, reg, imm); 2014 EmitGenericShift(4, Ty, reg, imm);
2010 } 2015 }
2011 2016
2012 void AssemblerX86::shl(Type Ty, GPRRegister operand, GPRRegister shifter) { 2017 void AssemblerX8632::shl(Type Ty, GPRRegister operand, GPRRegister shifter) {
2013 EmitGenericShift(4, Ty, Operand(operand), shifter); 2018 EmitGenericShift(4, Ty, Operand(operand), shifter);
2014 } 2019 }
2015 2020
2016 void AssemblerX86::shl(Type Ty, const Address &operand, GPRRegister shifter) { 2021 void AssemblerX8632::shl(Type Ty, const Address &operand, GPRRegister shifter) {
2017 EmitGenericShift(4, Ty, operand, shifter); 2022 EmitGenericShift(4, Ty, operand, shifter);
2018 } 2023 }
2019 2024
2020 void AssemblerX86::shr(Type Ty, GPRRegister reg, const Immediate &imm) { 2025 void AssemblerX8632::shr(Type Ty, GPRRegister reg, const Immediate &imm) {
2021 EmitGenericShift(5, Ty, reg, imm); 2026 EmitGenericShift(5, Ty, reg, imm);
2022 } 2027 }
2023 2028
2024 void AssemblerX86::shr(Type Ty, GPRRegister operand, GPRRegister shifter) { 2029 void AssemblerX8632::shr(Type Ty, GPRRegister operand, GPRRegister shifter) {
2025 EmitGenericShift(5, Ty, Operand(operand), shifter); 2030 EmitGenericShift(5, Ty, Operand(operand), shifter);
2026 } 2031 }
2027 2032
2028 void AssemblerX86::shr(Type Ty, const Address &operand, GPRRegister shifter) { 2033 void AssemblerX8632::shr(Type Ty, const Address &operand, GPRRegister shifter) {
2029 EmitGenericShift(5, Ty, operand, shifter); 2034 EmitGenericShift(5, Ty, operand, shifter);
2030 } 2035 }
2031 2036
2032 void AssemblerX86::sar(Type Ty, GPRRegister reg, const Immediate &imm) { 2037 void AssemblerX8632::sar(Type Ty, GPRRegister reg, const Immediate &imm) {
2033 EmitGenericShift(7, Ty, reg, imm); 2038 EmitGenericShift(7, Ty, reg, imm);
2034 } 2039 }
2035 2040
2036 void AssemblerX86::sar(Type Ty, GPRRegister operand, GPRRegister shifter) { 2041 void AssemblerX8632::sar(Type Ty, GPRRegister operand, GPRRegister shifter) {
2037 EmitGenericShift(7, Ty, Operand(operand), shifter); 2042 EmitGenericShift(7, Ty, Operand(operand), shifter);
2038 } 2043 }
2039 2044
2040 void AssemblerX86::sar(Type Ty, const Address &address, GPRRegister shifter) { 2045 void AssemblerX8632::sar(Type Ty, const Address &address, GPRRegister shifter) {
2041 EmitGenericShift(7, Ty, address, shifter); 2046 EmitGenericShift(7, Ty, address, shifter);
2042 } 2047 }
2043 2048
2044 void AssemblerX86::shld(Type Ty, GPRRegister dst, GPRRegister src) { 2049 void AssemblerX8632::shld(Type Ty, GPRRegister dst, GPRRegister src) {
2045 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2050 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2046 assert(Ty == IceType_i16 || Ty == IceType_i32); 2051 assert(Ty == IceType_i16 || Ty == IceType_i32);
2047 if (Ty == IceType_i16) 2052 if (Ty == IceType_i16)
2048 EmitOperandSizeOverride(); 2053 EmitOperandSizeOverride();
2049 EmitUint8(0x0F); 2054 EmitUint8(0x0F);
2050 EmitUint8(0xA5); 2055 EmitUint8(0xA5);
2051 EmitRegisterOperand(src, dst); 2056 EmitRegisterOperand(src, dst);
2052 } 2057 }
2053 2058
2054 void AssemblerX86::shld(Type Ty, GPRRegister dst, GPRRegister src, 2059 void AssemblerX8632::shld(Type Ty, GPRRegister dst, GPRRegister src,
2055 const Immediate &imm) { 2060 const Immediate &imm) {
2056 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2061 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2057 assert(Ty == IceType_i16 || Ty == IceType_i32); 2062 assert(Ty == IceType_i16 || Ty == IceType_i32);
2058 assert(imm.is_int8()); 2063 assert(imm.is_int8());
2059 if (Ty == IceType_i16) 2064 if (Ty == IceType_i16)
2060 EmitOperandSizeOverride(); 2065 EmitOperandSizeOverride();
2061 EmitUint8(0x0F); 2066 EmitUint8(0x0F);
2062 EmitUint8(0xA4); 2067 EmitUint8(0xA4);
2063 EmitRegisterOperand(src, dst); 2068 EmitRegisterOperand(src, dst);
2064 EmitUint8(imm.value() & 0xFF); 2069 EmitUint8(imm.value() & 0xFF);
2065 } 2070 }
2066 2071
2067 void AssemblerX86::shld(Type Ty, const Address &operand, GPRRegister src) { 2072 void AssemblerX8632::shld(Type Ty, const Address &operand, GPRRegister src) {
2068 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2073 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2069 assert(Ty == IceType_i16 || Ty == IceType_i32); 2074 assert(Ty == IceType_i16 || Ty == IceType_i32);
2070 if (Ty == IceType_i16) 2075 if (Ty == IceType_i16)
2071 EmitOperandSizeOverride(); 2076 EmitOperandSizeOverride();
2072 EmitUint8(0x0F); 2077 EmitUint8(0x0F);
2073 EmitUint8(0xA5); 2078 EmitUint8(0xA5);
2074 EmitOperand(src, operand); 2079 EmitOperand(src, operand);
2075 } 2080 }
2076 2081
2077 void AssemblerX86::shrd(Type Ty, GPRRegister dst, GPRRegister src) { 2082 void AssemblerX8632::shrd(Type Ty, GPRRegister dst, GPRRegister src) {
2078 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2083 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2079 assert(Ty == IceType_i16 || Ty == IceType_i32); 2084 assert(Ty == IceType_i16 || Ty == IceType_i32);
2080 if (Ty == IceType_i16) 2085 if (Ty == IceType_i16)
2081 EmitOperandSizeOverride(); 2086 EmitOperandSizeOverride();
2082 EmitUint8(0x0F); 2087 EmitUint8(0x0F);
2083 EmitUint8(0xAD); 2088 EmitUint8(0xAD);
2084 EmitRegisterOperand(src, dst); 2089 EmitRegisterOperand(src, dst);
2085 } 2090 }
2086 2091
2087 void AssemblerX86::shrd(Type Ty, GPRRegister dst, GPRRegister src, 2092 void AssemblerX8632::shrd(Type Ty, GPRRegister dst, GPRRegister src,
2088 const Immediate &imm) { 2093 const Immediate &imm) {
2089 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2094 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2090 assert(Ty == IceType_i16 || Ty == IceType_i32); 2095 assert(Ty == IceType_i16 || Ty == IceType_i32);
2091 assert(imm.is_int8()); 2096 assert(imm.is_int8());
2092 if (Ty == IceType_i16) 2097 if (Ty == IceType_i16)
2093 EmitOperandSizeOverride(); 2098 EmitOperandSizeOverride();
2094 EmitUint8(0x0F); 2099 EmitUint8(0x0F);
2095 EmitUint8(0xAC); 2100 EmitUint8(0xAC);
2096 EmitRegisterOperand(src, dst); 2101 EmitRegisterOperand(src, dst);
2097 EmitUint8(imm.value() & 0xFF); 2102 EmitUint8(imm.value() & 0xFF);
2098 } 2103 }
2099 2104
2100 void AssemblerX86::shrd(Type Ty, const Address &dst, GPRRegister src) { 2105 void AssemblerX8632::shrd(Type Ty, const Address &dst, GPRRegister src) {
2101 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2106 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2102 assert(Ty == IceType_i16 || Ty == IceType_i32); 2107 assert(Ty == IceType_i16 || Ty == IceType_i32);
2103 if (Ty == IceType_i16) 2108 if (Ty == IceType_i16)
2104 EmitOperandSizeOverride(); 2109 EmitOperandSizeOverride();
2105 EmitUint8(0x0F); 2110 EmitUint8(0x0F);
2106 EmitUint8(0xAD); 2111 EmitUint8(0xAD);
2107 EmitOperand(src, dst); 2112 EmitOperand(src, dst);
2108 } 2113 }
2109 2114
2110 void AssemblerX86::neg(Type Ty, GPRRegister reg) { 2115 void AssemblerX8632::neg(Type Ty, GPRRegister reg) {
2111 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2116 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2112 if (Ty == IceType_i16) 2117 if (Ty == IceType_i16)
2113 EmitOperandSizeOverride(); 2118 EmitOperandSizeOverride();
2114 if (isByteSizedArithType(Ty)) 2119 if (isByteSizedArithType(Ty))
2115 EmitUint8(0xF6); 2120 EmitUint8(0xF6);
2116 else 2121 else
2117 EmitUint8(0xF7); 2122 EmitUint8(0xF7);
2118 EmitRegisterOperand(3, reg); 2123 EmitRegisterOperand(3, reg);
2119 } 2124 }
2120 2125
2121 void AssemblerX86::neg(Type Ty, const Address &addr) { 2126 void AssemblerX8632::neg(Type Ty, const Address &addr) {
2122 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2127 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2123 if (Ty == IceType_i16) 2128 if (Ty == IceType_i16)
2124 EmitOperandSizeOverride(); 2129 EmitOperandSizeOverride();
2125 if (isByteSizedArithType(Ty)) 2130 if (isByteSizedArithType(Ty))
2126 EmitUint8(0xF6); 2131 EmitUint8(0xF6);
2127 else 2132 else
2128 EmitUint8(0xF7); 2133 EmitUint8(0xF7);
2129 EmitOperand(3, addr); 2134 EmitOperand(3, addr);
2130 } 2135 }
2131 2136
2132 void AssemblerX86::notl(GPRRegister reg) { 2137 void AssemblerX8632::notl(GPRRegister reg) {
2133 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2138 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2134 EmitUint8(0xF7); 2139 EmitUint8(0xF7);
2135 EmitUint8(0xD0 | reg); 2140 EmitUint8(0xD0 | reg);
2136 } 2141 }
2137 2142
2138 void AssemblerX86::bswap(Type Ty, GPRRegister reg) { 2143 void AssemblerX8632::bswap(Type Ty, GPRRegister reg) {
2139 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2144 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2140 assert(Ty == IceType_i32); 2145 assert(Ty == IceType_i32);
2141 (void)Ty; 2146 (void)Ty;
2142 EmitUint8(0x0F); 2147 EmitUint8(0x0F);
2143 EmitUint8(0xC8 | reg); 2148 EmitUint8(0xC8 | reg);
2144 } 2149 }
2145 2150
2146 void AssemblerX86::bsf(Type Ty, GPRRegister dst, GPRRegister src) { 2151 void AssemblerX8632::bsf(Type Ty, GPRRegister dst, GPRRegister src) {
2147 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2152 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2148 assert(Ty == IceType_i16 || Ty == IceType_i32); 2153 assert(Ty == IceType_i16 || Ty == IceType_i32);
2149 if (Ty == IceType_i16) 2154 if (Ty == IceType_i16)
2150 EmitOperandSizeOverride(); 2155 EmitOperandSizeOverride();
2151 EmitUint8(0x0F); 2156 EmitUint8(0x0F);
2152 EmitUint8(0xBC); 2157 EmitUint8(0xBC);
2153 EmitRegisterOperand(dst, src); 2158 EmitRegisterOperand(dst, src);
2154 } 2159 }
2155 2160
2156 void AssemblerX86::bsf(Type Ty, GPRRegister dst, const Address &src) { 2161 void AssemblerX8632::bsf(Type Ty, GPRRegister dst, const Address &src) {
2157 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2162 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2158 assert(Ty == IceType_i16 || Ty == IceType_i32); 2163 assert(Ty == IceType_i16 || Ty == IceType_i32);
2159 if (Ty == IceType_i16) 2164 if (Ty == IceType_i16)
2160 EmitOperandSizeOverride(); 2165 EmitOperandSizeOverride();
2161 EmitUint8(0x0F); 2166 EmitUint8(0x0F);
2162 EmitUint8(0xBC); 2167 EmitUint8(0xBC);
2163 EmitOperand(dst, src); 2168 EmitOperand(dst, src);
2164 } 2169 }
2165 2170
2166 void AssemblerX86::bsr(Type Ty, GPRRegister dst, GPRRegister src) { 2171 void AssemblerX8632::bsr(Type Ty, GPRRegister dst, GPRRegister src) {
2167 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2172 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2168 assert(Ty == IceType_i16 || Ty == IceType_i32); 2173 assert(Ty == IceType_i16 || Ty == IceType_i32);
2169 if (Ty == IceType_i16) 2174 if (Ty == IceType_i16)
2170 EmitOperandSizeOverride(); 2175 EmitOperandSizeOverride();
2171 EmitUint8(0x0F); 2176 EmitUint8(0x0F);
2172 EmitUint8(0xBD); 2177 EmitUint8(0xBD);
2173 EmitRegisterOperand(dst, src); 2178 EmitRegisterOperand(dst, src);
2174 } 2179 }
2175 2180
2176 void AssemblerX86::bsr(Type Ty, GPRRegister dst, const Address &src) { 2181 void AssemblerX8632::bsr(Type Ty, GPRRegister dst, const Address &src) {
2177 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2182 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2178 assert(Ty == IceType_i16 || Ty == IceType_i32); 2183 assert(Ty == IceType_i16 || Ty == IceType_i32);
2179 if (Ty == IceType_i16) 2184 if (Ty == IceType_i16)
2180 EmitOperandSizeOverride(); 2185 EmitOperandSizeOverride();
2181 EmitUint8(0x0F); 2186 EmitUint8(0x0F);
2182 EmitUint8(0xBD); 2187 EmitUint8(0xBD);
2183 EmitOperand(dst, src); 2188 EmitOperand(dst, src);
2184 } 2189 }
2185 2190
2186 void AssemblerX86::bt(GPRRegister base, GPRRegister offset) { 2191 void AssemblerX8632::bt(GPRRegister base, GPRRegister offset) {
2187 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2192 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2188 EmitUint8(0x0F); 2193 EmitUint8(0x0F);
2189 EmitUint8(0xA3); 2194 EmitUint8(0xA3);
2190 EmitRegisterOperand(offset, base); 2195 EmitRegisterOperand(offset, base);
2191 } 2196 }
2192 2197
2193 void AssemblerX86::ret() { 2198 void AssemblerX8632::ret() {
2194 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2199 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2195 EmitUint8(0xC3); 2200 EmitUint8(0xC3);
2196 } 2201 }
2197 2202
2198 void AssemblerX86::ret(const Immediate &imm) { 2203 void AssemblerX8632::ret(const Immediate &imm) {
2199 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2204 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2200 EmitUint8(0xC2); 2205 EmitUint8(0xC2);
2201 assert(imm.is_uint16()); 2206 assert(imm.is_uint16());
2202 EmitUint8(imm.value() & 0xFF); 2207 EmitUint8(imm.value() & 0xFF);
2203 EmitUint8((imm.value() >> 8) & 0xFF); 2208 EmitUint8((imm.value() >> 8) & 0xFF);
2204 } 2209 }
2205 2210
2206 void AssemblerX86::nop(int size) { 2211 void AssemblerX8632::nop(int size) {
2207 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2212 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2208 // There are nops up to size 15, but for now just provide up to size 8. 2213 // There are nops up to size 15, but for now just provide up to size 8.
2209 assert(0 < size && size <= MAX_NOP_SIZE); 2214 assert(0 < size && size <= MAX_NOP_SIZE);
2210 switch (size) { 2215 switch (size) {
2211 case 1: 2216 case 1:
2212 EmitUint8(0x90); 2217 EmitUint8(0x90);
2213 break; 2218 break;
2214 case 2: 2219 case 2:
2215 EmitUint8(0x66); 2220 EmitUint8(0x66);
2216 EmitUint8(0x90); 2221 EmitUint8(0x90);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2258 EmitUint8(0x00); 2263 EmitUint8(0x00);
2259 EmitUint8(0x00); 2264 EmitUint8(0x00);
2260 EmitUint8(0x00); 2265 EmitUint8(0x00);
2261 EmitUint8(0x00); 2266 EmitUint8(0x00);
2262 break; 2267 break;
2263 default: 2268 default:
2264 llvm_unreachable("Unimplemented"); 2269 llvm_unreachable("Unimplemented");
2265 } 2270 }
2266 } 2271 }
2267 2272
2268 void AssemblerX86::int3() { 2273 void AssemblerX8632::int3() {
2269 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2274 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2270 EmitUint8(0xCC); 2275 EmitUint8(0xCC);
2271 } 2276 }
2272 2277
2273 void AssemblerX86::hlt() { 2278 void AssemblerX8632::hlt() {
2274 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2279 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2275 EmitUint8(0xF4); 2280 EmitUint8(0xF4);
2276 } 2281 }
2277 2282
2278 void AssemblerX86::ud2() { 2283 void AssemblerX8632::ud2() {
2279 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2284 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2280 EmitUint8(0x0F); 2285 EmitUint8(0x0F);
2281 EmitUint8(0x0B); 2286 EmitUint8(0x0B);
2282 } 2287 }
2283 2288
2284 void AssemblerX86::j(CondX86::BrCond condition, Label *label, bool near) { 2289 void AssemblerX8632::j(CondX86::BrCond condition, Label *label, bool near) {
2285 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2290 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2286 if (label->IsBound()) { 2291 if (label->IsBound()) {
2287 static const int kShortSize = 2; 2292 static const int kShortSize = 2;
2288 static const int kLongSize = 6; 2293 static const int kLongSize = 6;
2289 intptr_t offset = label->Position() - buffer_.Size(); 2294 intptr_t offset = label->Position() - buffer_.Size();
2290 assert(offset <= 0); 2295 assert(offset <= 0);
2291 if (Utils::IsInt(8, offset - kShortSize)) { 2296 if (Utils::IsInt(8, offset - kShortSize)) {
2292 // TODO(stichnot): Here and in jmp(), we may need to be more 2297 // TODO(stichnot): Here and in jmp(), we may need to be more
2293 // conservative about the backward branch distance if the branch 2298 // conservative about the backward branch distance if the branch
2294 // instruction is within a bundle_lock sequence, because the 2299 // instruction is within a bundle_lock sequence, because the
(...skipping 11 matching lines...) Expand all
2306 } else if (near) { 2311 } else if (near) {
2307 EmitUint8(0x70 + condition); 2312 EmitUint8(0x70 + condition);
2308 EmitNearLabelLink(label); 2313 EmitNearLabelLink(label);
2309 } else { 2314 } else {
2310 EmitUint8(0x0F); 2315 EmitUint8(0x0F);
2311 EmitUint8(0x80 + condition); 2316 EmitUint8(0x80 + condition);
2312 EmitLabelLink(label); 2317 EmitLabelLink(label);
2313 } 2318 }
2314 } 2319 }
2315 2320
2316 void AssemblerX86::j(CondX86::BrCond condition, 2321 void AssemblerX8632::j(CondX86::BrCond condition,
2317 const ConstantRelocatable *label) { 2322 const ConstantRelocatable *label) {
2318 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2323 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2319 EmitUint8(0x0F); 2324 EmitUint8(0x0F);
2320 EmitUint8(0x80 + condition); 2325 EmitUint8(0x80 + condition);
2321 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label)); 2326 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
2322 EmitInt32(-4); 2327 EmitInt32(-4);
2323 } 2328 }
2324 2329
2325 void AssemblerX86::jmp(GPRRegister reg) { 2330 void AssemblerX8632::jmp(GPRRegister reg) {
2326 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2331 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2327 EmitUint8(0xFF); 2332 EmitUint8(0xFF);
2328 EmitRegisterOperand(4, reg); 2333 EmitRegisterOperand(4, reg);
2329 } 2334 }
2330 2335
2331 void AssemblerX86::jmp(Label *label, bool near) { 2336 void AssemblerX8632::jmp(Label *label, bool near) {
2332 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2337 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2333 if (label->IsBound()) { 2338 if (label->IsBound()) {
2334 static const int kShortSize = 2; 2339 static const int kShortSize = 2;
2335 static const int kLongSize = 5; 2340 static const int kLongSize = 5;
2336 intptr_t offset = label->Position() - buffer_.Size(); 2341 intptr_t offset = label->Position() - buffer_.Size();
2337 assert(offset <= 0); 2342 assert(offset <= 0);
2338 if (Utils::IsInt(8, offset - kShortSize)) { 2343 if (Utils::IsInt(8, offset - kShortSize)) {
2339 EmitUint8(0xEB); 2344 EmitUint8(0xEB);
2340 EmitUint8((offset - kShortSize) & 0xFF); 2345 EmitUint8((offset - kShortSize) & 0xFF);
2341 } else { 2346 } else {
2342 EmitUint8(0xE9); 2347 EmitUint8(0xE9);
2343 EmitInt32(offset - kLongSize); 2348 EmitInt32(offset - kLongSize);
2344 } 2349 }
2345 } else if (near) { 2350 } else if (near) {
2346 EmitUint8(0xEB); 2351 EmitUint8(0xEB);
2347 EmitNearLabelLink(label); 2352 EmitNearLabelLink(label);
2348 } else { 2353 } else {
2349 EmitUint8(0xE9); 2354 EmitUint8(0xE9);
2350 EmitLabelLink(label); 2355 EmitLabelLink(label);
2351 } 2356 }
2352 } 2357 }
2353 2358
2354 void AssemblerX86::jmp(const ConstantRelocatable *label) { 2359 void AssemblerX8632::jmp(const ConstantRelocatable *label) {
2355 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2360 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2356 EmitUint8(0xE9); 2361 EmitUint8(0xE9);
2357 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label)); 2362 EmitFixup(this->createFixup(llvm::ELF::R_386_PC32, label));
2358 EmitInt32(-4); 2363 EmitInt32(-4);
2359 } 2364 }
2360 2365
2361 void AssemblerX86::mfence() { 2366 void AssemblerX8632::mfence() {
2362 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2367 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2363 EmitUint8(0x0F); 2368 EmitUint8(0x0F);
2364 EmitUint8(0xAE); 2369 EmitUint8(0xAE);
2365 EmitUint8(0xF0); 2370 EmitUint8(0xF0);
2366 } 2371 }
2367 2372
2368 void AssemblerX86::lock() { 2373 void AssemblerX8632::lock() {
2369 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2374 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2370 EmitUint8(0xF0); 2375 EmitUint8(0xF0);
2371 } 2376 }
2372 2377
2373 void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg, 2378 void AssemblerX8632::cmpxchg(Type Ty, const Address &address, GPRRegister reg,
2374 bool Locked) { 2379 bool Locked) {
2375 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2380 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2376 if (Ty == IceType_i16) 2381 if (Ty == IceType_i16)
2377 EmitOperandSizeOverride(); 2382 EmitOperandSizeOverride();
2378 if (Locked) 2383 if (Locked)
2379 EmitUint8(0xF0); 2384 EmitUint8(0xF0);
2380 EmitUint8(0x0F); 2385 EmitUint8(0x0F);
2381 if (isByteSizedArithType(Ty)) 2386 if (isByteSizedArithType(Ty))
2382 EmitUint8(0xB0); 2387 EmitUint8(0xB0);
2383 else 2388 else
2384 EmitUint8(0xB1); 2389 EmitUint8(0xB1);
2385 EmitOperand(reg, address); 2390 EmitOperand(reg, address);
2386 } 2391 }
2387 2392
2388 void AssemblerX86::cmpxchg8b(const Address &address, bool Locked) { 2393 void AssemblerX8632::cmpxchg8b(const Address &address, bool Locked) {
2389 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2394 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2390 if (Locked) 2395 if (Locked)
2391 EmitUint8(0xF0); 2396 EmitUint8(0xF0);
2392 EmitUint8(0x0F); 2397 EmitUint8(0x0F);
2393 EmitUint8(0xC7); 2398 EmitUint8(0xC7);
2394 EmitOperand(1, address); 2399 EmitOperand(1, address);
2395 } 2400 }
2396 2401
2397 void AssemblerX86::xadd(Type Ty, const Address &addr, GPRRegister reg, 2402 void AssemblerX8632::xadd(Type Ty, const Address &addr, GPRRegister reg,
2398 bool Locked) { 2403 bool Locked) {
2399 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2404 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2400 if (Ty == IceType_i16) 2405 if (Ty == IceType_i16)
2401 EmitOperandSizeOverride(); 2406 EmitOperandSizeOverride();
2402 if (Locked) 2407 if (Locked)
2403 EmitUint8(0xF0); 2408 EmitUint8(0xF0);
2404 EmitUint8(0x0F); 2409 EmitUint8(0x0F);
2405 if (isByteSizedArithType(Ty)) 2410 if (isByteSizedArithType(Ty))
2406 EmitUint8(0xC0); 2411 EmitUint8(0xC0);
2407 else 2412 else
2408 EmitUint8(0xC1); 2413 EmitUint8(0xC1);
2409 EmitOperand(reg, addr); 2414 EmitOperand(reg, addr);
2410 } 2415 }
2411 2416
2412 void AssemblerX86::xchg(Type Ty, const Address &addr, GPRRegister reg) { 2417 void AssemblerX8632::xchg(Type Ty, const Address &addr, GPRRegister reg) {
2413 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2418 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2414 if (Ty == IceType_i16) 2419 if (Ty == IceType_i16)
2415 EmitOperandSizeOverride(); 2420 EmitOperandSizeOverride();
2416 if (isByteSizedArithType(Ty)) 2421 if (isByteSizedArithType(Ty))
2417 EmitUint8(0x86); 2422 EmitUint8(0x86);
2418 else 2423 else
2419 EmitUint8(0x87); 2424 EmitUint8(0x87);
2420 EmitOperand(reg, addr); 2425 EmitOperand(reg, addr);
2421 } 2426 }
2422 2427
2423 void AssemblerX86::EmitSegmentOverride(uint8_t prefix) { 2428 void AssemblerX8632::EmitSegmentOverride(uint8_t prefix) {
2424 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2429 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2425 EmitUint8(prefix); 2430 EmitUint8(prefix);
2426 } 2431 }
2427 2432
2428 void AssemblerX86::Align(intptr_t alignment, intptr_t offset) { 2433 void AssemblerX8632::Align(intptr_t alignment, intptr_t offset) {
2429 assert(llvm::isPowerOf2_32(alignment)); 2434 assert(llvm::isPowerOf2_32(alignment));
2430 intptr_t pos = offset + buffer_.GetPosition(); 2435 intptr_t pos = offset + buffer_.GetPosition();
2431 intptr_t mod = pos & (alignment - 1); 2436 intptr_t mod = pos & (alignment - 1);
2432 if (mod == 0) { 2437 if (mod == 0) {
2433 return; 2438 return;
2434 } 2439 }
2435 intptr_t bytes_needed = alignment - mod; 2440 intptr_t bytes_needed = alignment - mod;
2436 while (bytes_needed > MAX_NOP_SIZE) { 2441 while (bytes_needed > MAX_NOP_SIZE) {
2437 nop(MAX_NOP_SIZE); 2442 nop(MAX_NOP_SIZE);
2438 bytes_needed -= MAX_NOP_SIZE; 2443 bytes_needed -= MAX_NOP_SIZE;
2439 } 2444 }
2440 if (bytes_needed) { 2445 if (bytes_needed) {
2441 nop(bytes_needed); 2446 nop(bytes_needed);
2442 } 2447 }
2443 assert(((offset + buffer_.GetPosition()) & (alignment - 1)) == 0); 2448 assert(((offset + buffer_.GetPosition()) & (alignment - 1)) == 0);
2444 } 2449 }
2445 2450
2446 void AssemblerX86::Bind(Label *label) { 2451 void AssemblerX8632::Bind(Label *label) {
2447 intptr_t bound = buffer_.Size(); 2452 intptr_t bound = buffer_.Size();
2448 assert(!label->IsBound()); // Labels can only be bound once. 2453 assert(!label->IsBound()); // Labels can only be bound once.
2449 while (label->IsLinked()) { 2454 while (label->IsLinked()) {
2450 intptr_t position = label->LinkPosition(); 2455 intptr_t position = label->LinkPosition();
2451 intptr_t next = buffer_.Load<int32_t>(position); 2456 intptr_t next = buffer_.Load<int32_t>(position);
2452 buffer_.Store<int32_t>(position, bound - (position + 4)); 2457 buffer_.Store<int32_t>(position, bound - (position + 4));
2453 label->position_ = next; 2458 label->position_ = next;
2454 } 2459 }
2455 while (label->HasNear()) { 2460 while (label->HasNear()) {
2456 intptr_t position = label->NearPosition(); 2461 intptr_t position = label->NearPosition();
2457 intptr_t offset = bound - (position + 1); 2462 intptr_t offset = bound - (position + 1);
2458 assert(Utils::IsInt(8, offset)); 2463 assert(Utils::IsInt(8, offset));
2459 buffer_.Store<int8_t>(position, offset); 2464 buffer_.Store<int8_t>(position, offset);
2460 } 2465 }
2461 label->BindTo(bound); 2466 label->BindTo(bound);
2462 } 2467 }
2463 2468
2464 void AssemblerX86::EmitOperand(int rm, const Operand &operand) { 2469 void AssemblerX8632::EmitOperand(int rm, const Operand &operand) {
2465 assert(rm >= 0 && rm < 8); 2470 assert(rm >= 0 && rm < 8);
2466 const intptr_t length = operand.length_; 2471 const intptr_t length = operand.length_;
2467 assert(length > 0); 2472 assert(length > 0);
2468 // Emit the ModRM byte updated with the given RM value. 2473 // Emit the ModRM byte updated with the given RM value.
2469 assert((operand.encoding_[0] & 0x38) == 0); 2474 assert((operand.encoding_[0] & 0x38) == 0);
2470 EmitUint8(operand.encoding_[0] + (rm << 3)); 2475 EmitUint8(operand.encoding_[0] + (rm << 3));
2471 if (operand.fixup()) { 2476 if (operand.fixup()) {
2472 EmitFixup(operand.fixup()); 2477 EmitFixup(operand.fixup());
2473 } 2478 }
2474 // Emit the rest of the encoded operand. 2479 // Emit the rest of the encoded operand.
2475 for (intptr_t i = 1; i < length; i++) { 2480 for (intptr_t i = 1; i < length; i++) {
2476 EmitUint8(operand.encoding_[i]); 2481 EmitUint8(operand.encoding_[i]);
2477 } 2482 }
2478 } 2483 }
2479 2484
2480 void AssemblerX86::EmitImmediate(Type Ty, const Immediate &imm) { 2485 void AssemblerX8632::EmitImmediate(Type Ty, const Immediate &imm) {
2481 if (Ty == IceType_i16) { 2486 if (Ty == IceType_i16) {
2482 assert(!imm.fixup()); 2487 assert(!imm.fixup());
2483 EmitInt16(imm.value()); 2488 EmitInt16(imm.value());
2484 } else { 2489 } else {
2485 if (imm.fixup()) { 2490 if (imm.fixup()) {
2486 EmitFixup(imm.fixup()); 2491 EmitFixup(imm.fixup());
2487 } 2492 }
2488 EmitInt32(imm.value()); 2493 EmitInt32(imm.value());
2489 } 2494 }
2490 } 2495 }
2491 2496
2492 void AssemblerX86::EmitComplexI8(int rm, const Operand &operand, 2497 void AssemblerX8632::EmitComplexI8(int rm, const Operand &operand,
2493 const Immediate &immediate) { 2498 const Immediate &immediate) {
2494 assert(rm >= 0 && rm < 8); 2499 assert(rm >= 0 && rm < 8);
2495 assert(immediate.is_int8()); 2500 assert(immediate.is_int8());
2496 if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) { 2501 if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) {
2497 // Use short form if the destination is al. 2502 // Use short form if the destination is al.
2498 EmitUint8(0x04 + (rm << 3)); 2503 EmitUint8(0x04 + (rm << 3));
2499 EmitUint8(immediate.value() & 0xFF); 2504 EmitUint8(immediate.value() & 0xFF);
2500 } else { 2505 } else {
2501 // Use sign-extended 8-bit immediate. 2506 // Use sign-extended 8-bit immediate.
2502 EmitUint8(0x80); 2507 EmitUint8(0x80);
2503 EmitOperand(rm, operand); 2508 EmitOperand(rm, operand);
2504 EmitUint8(immediate.value() & 0xFF); 2509 EmitUint8(immediate.value() & 0xFF);
2505 } 2510 }
2506 } 2511 }
2507 2512
2508 void AssemblerX86::EmitComplex(Type Ty, int rm, const Operand &operand, 2513 void AssemblerX8632::EmitComplex(Type Ty, int rm, const Operand &operand,
2509 const Immediate &immediate) { 2514 const Immediate &immediate) {
2510 assert(rm >= 0 && rm < 8); 2515 assert(rm >= 0 && rm < 8);
2511 if (immediate.is_int8()) { 2516 if (immediate.is_int8()) {
2512 // Use sign-extended 8-bit immediate. 2517 // Use sign-extended 8-bit immediate.
2513 EmitUint8(0x83); 2518 EmitUint8(0x83);
2514 EmitOperand(rm, operand); 2519 EmitOperand(rm, operand);
2515 EmitUint8(immediate.value() & 0xFF); 2520 EmitUint8(immediate.value() & 0xFF);
2516 } else if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) { 2521 } else if (operand.IsRegister(RegX8632::Encoded_Reg_eax)) {
2517 // Use short form if the destination is eax. 2522 // Use short form if the destination is eax.
2518 EmitUint8(0x05 + (rm << 3)); 2523 EmitUint8(0x05 + (rm << 3));
2519 EmitImmediate(Ty, immediate); 2524 EmitImmediate(Ty, immediate);
2520 } else { 2525 } else {
2521 EmitUint8(0x81); 2526 EmitUint8(0x81);
2522 EmitOperand(rm, operand); 2527 EmitOperand(rm, operand);
2523 EmitImmediate(Ty, immediate); 2528 EmitImmediate(Ty, immediate);
2524 } 2529 }
2525 } 2530 }
2526 2531
2527 void AssemblerX86::EmitLabel(Label *label, intptr_t instruction_size) { 2532 void AssemblerX8632::EmitLabel(Label *label, intptr_t instruction_size) {
2528 if (label->IsBound()) { 2533 if (label->IsBound()) {
2529 intptr_t offset = label->Position() - buffer_.Size(); 2534 intptr_t offset = label->Position() - buffer_.Size();
2530 assert(offset <= 0); 2535 assert(offset <= 0);
2531 EmitInt32(offset - instruction_size); 2536 EmitInt32(offset - instruction_size);
2532 } else { 2537 } else {
2533 EmitLabelLink(label); 2538 EmitLabelLink(label);
2534 } 2539 }
2535 } 2540 }
2536 2541
2537 void AssemblerX86::EmitLabelLink(Label *label) { 2542 void AssemblerX8632::EmitLabelLink(Label *label) {
2538 assert(!label->IsBound()); 2543 assert(!label->IsBound());
2539 intptr_t position = buffer_.Size(); 2544 intptr_t position = buffer_.Size();
2540 EmitInt32(label->position_); 2545 EmitInt32(label->position_);
2541 if (!getPreliminary()) 2546 if (!getPreliminary())
2542 label->LinkTo(position); 2547 label->LinkTo(position);
2543 } 2548 }
2544 2549
2545 void AssemblerX86::EmitNearLabelLink(Label *label) { 2550 void AssemblerX8632::EmitNearLabelLink(Label *label) {
2546 assert(!label->IsBound()); 2551 assert(!label->IsBound());
2547 intptr_t position = buffer_.Size(); 2552 intptr_t position = buffer_.Size();
2548 EmitUint8(0); 2553 EmitUint8(0);
2549 if (!getPreliminary()) 2554 if (!getPreliminary())
2550 label->NearLinkTo(position); 2555 label->NearLinkTo(position);
2551 } 2556 }
2552 2557
2553 void AssemblerX86::EmitGenericShift(int rm, Type Ty, GPRRegister reg, 2558 void AssemblerX8632::EmitGenericShift(int rm, Type Ty, GPRRegister reg,
2554 const Immediate &imm) { 2559 const Immediate &imm) {
2555 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2560 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2556 assert(imm.is_int8()); 2561 assert(imm.is_int8());
2557 if (Ty == IceType_i16) 2562 if (Ty == IceType_i16)
2558 EmitOperandSizeOverride(); 2563 EmitOperandSizeOverride();
2559 if (imm.value() == 1) { 2564 if (imm.value() == 1) {
2560 EmitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1); 2565 EmitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1);
2561 EmitOperand(rm, Operand(reg)); 2566 EmitOperand(rm, Operand(reg));
2562 } else { 2567 } else {
2563 EmitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1); 2568 EmitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1);
2564 EmitOperand(rm, Operand(reg)); 2569 EmitOperand(rm, Operand(reg));
2565 EmitUint8(imm.value() & 0xFF); 2570 EmitUint8(imm.value() & 0xFF);
2566 } 2571 }
2567 } 2572 }
2568 2573
2569 void AssemblerX86::EmitGenericShift(int rm, Type Ty, const Operand &operand, 2574 void AssemblerX8632::EmitGenericShift(int rm, Type Ty, const Operand &operand,
2570 GPRRegister shifter) { 2575 GPRRegister shifter) {
2571 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2576 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
2572 assert(shifter == RegX8632::Encoded_Reg_ecx); 2577 assert(shifter == RegX8632::Encoded_Reg_ecx);
2573 (void)shifter; 2578 (void)shifter;
2574 if (Ty == IceType_i16) 2579 if (Ty == IceType_i16)
2575 EmitOperandSizeOverride(); 2580 EmitOperandSizeOverride();
2576 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); 2581 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
2577 EmitOperand(rm, operand); 2582 EmitOperand(rm, operand);
2578 } 2583 }
2579 2584
2580 } // end of namespace x86 2585 } // end of namespace X8632
2581 } // end of namespace Ice 2586 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/assembler_ia32.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698