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

Side by Side Diff: src/IceAssemblerX86BaseImpl.h

Issue 1537703002: Subzero. x8664. Resurrects the Target. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments Created 5 years 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
OLDNEW
1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=// 1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=//
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
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) { 105 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) {
106 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
107 emitRexB(RexTypeIrrelevant, reg); 107 emitRexB(RexTypeIrrelevant, reg);
108 emitUint8(0xFF); 108 emitUint8(0xFF);
109 emitRegisterOperand(2, gprEncoding(reg)); 109 emitRegisterOperand(2, gprEncoding(reg));
110 } 110 }
111 111
112 template <class Machine> 112 template <class Machine>
113 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) { 113 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) {
114 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 114 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
115 emitAddrSizeOverridePrefix();
115 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); 116 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
116 emitUint8(0xFF); 117 emitUint8(0xFF);
117 emitOperand(2, address); 118 emitOperand(2, address);
118 } 119 }
119 120
120 template <class Machine> 121 template <class Machine>
121 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) { 122 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) {
122 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 123 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
123 intptr_t call_start = Buffer.getPosition(); 124 intptr_t call_start = Buffer.getPosition();
124 emitUint8(0xE8); 125 emitUint8(0xE8);
(...skipping 26 matching lines...) Expand all
151 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 152 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
152 // Any type that would not force a REX prefix to be emitted can be provided 153 // Any type that would not force a REX prefix to be emitted can be provided
153 // here. 154 // here.
154 emitRexB(RexTypeIrrelevant, reg); 155 emitRexB(RexTypeIrrelevant, reg);
155 emitUint8(0x58 + gprEncoding(reg)); 156 emitUint8(0x58 + gprEncoding(reg));
156 } 157 }
157 158
158 template <class Machine> 159 template <class Machine>
159 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) { 160 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) {
160 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 161 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
162 emitAddrSizeOverridePrefix();
161 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); 163 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
162 emitUint8(0x8F); 164 emitUint8(0x8F);
163 emitOperand(0, address); 165 emitOperand(0, address);
164 } 166 }
165 167
166 template <class Machine> 168 template <class Machine>
167 template <typename, typename> 169 template <typename, typename>
168 void AssemblerX86Base<Machine>::pushal() { 170 void AssemblerX86Base<Machine>::pushal() {
169 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 171 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
170 emitUint8(0x60); 172 emitUint8(0x60);
(...skipping 13 matching lines...) Expand all
184 emitRexB(IceType_i8, dst); 186 emitRexB(IceType_i8, dst);
185 emitUint8(0x0F); 187 emitUint8(0x0F);
186 emitUint8(0x90 + condition); 188 emitUint8(0x90 + condition);
187 emitUint8(0xC0 + gprEncoding(dst)); 189 emitUint8(0xC0 + gprEncoding(dst));
188 } 190 }
189 191
190 template <class Machine> 192 template <class Machine>
191 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, 193 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
192 const typename Traits::Address &address) { 194 const typename Traits::Address &address) {
193 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 195 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
196 emitAddrSizeOverridePrefix();
194 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant); 197 emitRex(RexTypeIrrelevant, address, RexRegIrrelevant);
195 emitUint8(0x0F); 198 emitUint8(0x0F);
196 emitUint8(0x90 + condition); 199 emitUint8(0x90 + condition);
197 emitOperand(0, address); 200 emitOperand(0, address);
198 } 201 }
199 202
200 template <class Machine> 203 template <class Machine>
201 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 204 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
202 const Immediate &imm) { 205 const Immediate &imm) {
203 assert(Ty != IceType_i64 && "i64 not supported yet."); 206 assert(Ty != IceType_i64 && "i64 not supported yet.");
(...skipping 26 matching lines...) Expand all
230 } 233 }
231 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); 234 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
232 } 235 }
233 236
234 template <class Machine> 237 template <class Machine>
235 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 238 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
236 const typename Traits::Address &src) { 239 const typename Traits::Address &src) {
237 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 240 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
238 if (Ty == IceType_i16) 241 if (Ty == IceType_i16)
239 emitOperandSizeOverride(); 242 emitOperandSizeOverride();
243 emitAddrSizeOverridePrefix();
240 emitRex(Ty, src, dst); 244 emitRex(Ty, src, dst);
241 if (isByteSizedType(Ty)) { 245 if (isByteSizedType(Ty)) {
242 emitUint8(0x8A); 246 emitUint8(0x8A);
243 } else { 247 } else {
244 emitUint8(0x8B); 248 emitUint8(0x8B);
245 } 249 }
246 emitOperand(gprEncoding(dst), src); 250 emitOperand(gprEncoding(dst), src);
247 } 251 }
248 252
249 template <class Machine> 253 template <class Machine>
250 void AssemblerX86Base<Machine>::mov(Type Ty, 254 void AssemblerX86Base<Machine>::mov(Type Ty,
251 const typename Traits::Address &dst, 255 const typename Traits::Address &dst,
252 typename Traits::GPRRegister src) { 256 typename Traits::GPRRegister src) {
253 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 257 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
254 if (Ty == IceType_i16) 258 if (Ty == IceType_i16)
255 emitOperandSizeOverride(); 259 emitOperandSizeOverride();
260 emitAddrSizeOverridePrefix();
256 emitRex(Ty, dst, src); 261 emitRex(Ty, dst, src);
257 if (isByteSizedType(Ty)) { 262 if (isByteSizedType(Ty)) {
258 emitUint8(0x88); 263 emitUint8(0x88);
259 } else { 264 } else {
260 emitUint8(0x89); 265 emitUint8(0x89);
261 } 266 }
262 emitOperand(gprEncoding(src), dst); 267 emitOperand(gprEncoding(src), dst);
263 } 268 }
264 269
265 template <class Machine> 270 template <class Machine>
266 void AssemblerX86Base<Machine>::mov(Type Ty, 271 void AssemblerX86Base<Machine>::mov(Type Ty,
267 const typename Traits::Address &dst, 272 const typename Traits::Address &dst,
268 const Immediate &imm) { 273 const Immediate &imm) {
269 assert(Ty != IceType_i64 && "i64 not supported yet."); 274 assert(Ty != IceType_i64 && "i64 not supported yet.");
270 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 275 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
271 if (Ty == IceType_i16) 276 if (Ty == IceType_i16)
272 emitOperandSizeOverride(); 277 emitOperandSizeOverride();
278 emitAddrSizeOverridePrefix();
273 emitRex(Ty, dst, RexRegIrrelevant); 279 emitRex(Ty, dst, RexRegIrrelevant);
274 if (isByteSizedType(Ty)) { 280 if (isByteSizedType(Ty)) {
275 emitUint8(0xC6); 281 emitUint8(0xC6);
276 emitOperand(0, dst); 282 emitOperand(0, dst);
277 emitUint8(imm.value() & 0xFF); 283 emitUint8(imm.value() & 0xFF);
278 } else { 284 } else {
279 emitUint8(0xC7); 285 emitUint8(0xC7);
280 emitOperand(0, dst); 286 emitOperand(0, dst);
281 emitImmediate(Ty, imm); 287 emitImmediate(Ty, imm);
282 } 288 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 if (Traits::Is64Bit && SrcTy == IceType_i32) { 333 if (Traits::Is64Bit && SrcTy == IceType_i32) {
328 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit 334 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit
329 // operand to 64-bit. 335 // operand to 64-bit.
330 mov(IceType_i32, dst, src); 336 mov(IceType_i32, dst, src);
331 return; 337 return;
332 } 338 }
333 339
334 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 340 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
335 bool ByteSized = isByteSizedType(SrcTy); 341 bool ByteSized = isByteSizedType(SrcTy);
336 assert(ByteSized || SrcTy == IceType_i16); 342 assert(ByteSized || SrcTy == IceType_i16);
343 emitAddrSizeOverridePrefix();
337 emitRex(SrcTy, src, RexTypeIrrelevant, dst); 344 emitRex(SrcTy, src, RexTypeIrrelevant, dst);
338 emitUint8(0x0F); 345 emitUint8(0x0F);
339 emitUint8(ByteSized ? 0xB6 : 0xB7); 346 emitUint8(ByteSized ? 0xB6 : 0xB7);
340 emitOperand(gprEncoding(dst), src); 347 emitOperand(gprEncoding(dst), src);
341 } 348 }
342 349
343 template <class Machine> 350 template <class Machine>
344 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 351 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
345 typename Traits::GPRRegister dst, 352 typename Traits::GPRRegister dst,
346 typename Traits::GPRRegister src) { 353 typename Traits::GPRRegister src) {
347 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 354 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
348 bool ByteSized = isByteSizedType(SrcTy); 355 bool ByteSized = isByteSizedType(SrcTy);
349 emitRexRB(RexTypeForceRexW, dst, SrcTy, src); 356 emitRexRB(RexTypeForceRexW, dst, SrcTy, src);
350 if (ByteSized || SrcTy == IceType_i16) { 357 if (ByteSized || SrcTy == IceType_i16) {
351 emitUint8(0x0F); 358 emitUint8(0x0F);
352 emitUint8(ByteSized ? 0xBE : 0xBF); 359 emitUint8(ByteSized ? 0xBE : 0xBF);
353 } else { 360 } else {
354 assert(Traits::Is64Bit && SrcTy == IceType_i32); 361 assert(Traits::Is64Bit && SrcTy == IceType_i32);
355 emitUint8(0x63); 362 emitUint8(0x63);
356 } 363 }
357 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 364 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
358 } 365 }
359 366
360 template <class Machine> 367 template <class Machine>
361 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 368 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
362 typename Traits::GPRRegister dst, 369 typename Traits::GPRRegister dst,
363 const typename Traits::Address &src) { 370 const typename Traits::Address &src) {
364 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 371 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
365 bool ByteSized = isByteSizedType(SrcTy); 372 bool ByteSized = isByteSizedType(SrcTy);
373 emitAddrSizeOverridePrefix();
366 emitRex(SrcTy, src, RexTypeForceRexW, dst); 374 emitRex(SrcTy, src, RexTypeForceRexW, dst);
367 if (ByteSized || SrcTy == IceType_i16) { 375 if (ByteSized || SrcTy == IceType_i16) {
368 emitUint8(0x0F); 376 emitUint8(0x0F);
369 emitUint8(ByteSized ? 0xBE : 0xBF); 377 emitUint8(ByteSized ? 0xBE : 0xBF);
370 } else { 378 } else {
371 assert(Traits::Is64Bit && SrcTy == IceType_i32); 379 assert(Traits::Is64Bit && SrcTy == IceType_i32);
372 emitUint8(0x63); 380 emitUint8(0x63);
373 } 381 }
374 emitOperand(gprEncoding(dst), src); 382 emitOperand(gprEncoding(dst), src);
375 } 383 }
376 384
377 template <class Machine> 385 template <class Machine>
378 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst, 386 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst,
379 const typename Traits::Address &src) { 387 const typename Traits::Address &src) {
380 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 388 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
381 assert(Ty == IceType_i16 || Ty == IceType_i32); 389 assert(Ty == IceType_i16 || Ty == IceType_i32);
382 if (Ty == IceType_i16) 390 if (Ty == IceType_i16)
383 emitOperandSizeOverride(); 391 emitOperandSizeOverride();
392 emitAddrSizeOverridePrefix();
384 emitRex(Ty, src, dst); 393 emitRex(Ty, src, dst);
385 emitUint8(0x8D); 394 emitUint8(0x8D);
386 emitOperand(gprEncoding(dst), src); 395 emitOperand(gprEncoding(dst), src);
387 } 396 }
388 397
389 template <class Machine> 398 template <class Machine>
390 void AssemblerX86Base<Machine>::cmov(Type Ty, 399 void AssemblerX86Base<Machine>::cmov(Type Ty,
391 typename Traits::Cond::BrCond cond, 400 typename Traits::Cond::BrCond cond,
392 typename Traits::GPRRegister dst, 401 typename Traits::GPRRegister dst,
393 typename Traits::GPRRegister src) { 402 typename Traits::GPRRegister src) {
(...skipping 11 matching lines...) Expand all
405 template <class Machine> 414 template <class Machine>
406 void AssemblerX86Base<Machine>::cmov(Type Ty, 415 void AssemblerX86Base<Machine>::cmov(Type Ty,
407 typename Traits::Cond::BrCond cond, 416 typename Traits::Cond::BrCond cond,
408 typename Traits::GPRRegister dst, 417 typename Traits::GPRRegister dst,
409 const typename Traits::Address &src) { 418 const typename Traits::Address &src) {
410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 419 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
411 if (Ty == IceType_i16) 420 if (Ty == IceType_i16)
412 emitOperandSizeOverride(); 421 emitOperandSizeOverride();
413 else 422 else
414 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); 423 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
424 emitAddrSizeOverridePrefix();
415 emitRex(Ty, src, dst); 425 emitRex(Ty, src, dst);
416 emitUint8(0x0F); 426 emitUint8(0x0F);
417 emitUint8(0x40 + cond); 427 emitUint8(0x40 + cond);
418 emitOperand(gprEncoding(dst), src); 428 emitOperand(gprEncoding(dst), src);
419 } 429 }
420 430
421 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { 431 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() {
422 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 432 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
423 emitUint8(0xF3); 433 emitUint8(0xF3);
424 emitUint8(0xA4); 434 emitUint8(0xA4);
425 } 435 }
426 436
427 template <class Machine> 437 template <class Machine>
428 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 438 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
429 const typename Traits::Address &src) { 439 const typename Traits::Address &src) {
430 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 440 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
431 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 441 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
442 emitAddrSizeOverridePrefix();
432 emitRex(RexTypeIrrelevant, src, dst); 443 emitRex(RexTypeIrrelevant, src, dst);
433 emitUint8(0x0F); 444 emitUint8(0x0F);
434 emitUint8(0x10); 445 emitUint8(0x10);
435 emitOperand(gprEncoding(dst), src); 446 emitOperand(gprEncoding(dst), src);
436 } 447 }
437 448
438 template <class Machine> 449 template <class Machine>
439 void AssemblerX86Base<Machine>::movss(Type Ty, 450 void AssemblerX86Base<Machine>::movss(Type Ty,
440 const typename Traits::Address &dst, 451 const typename Traits::Address &dst,
441 typename Traits::XmmRegister src) { 452 typename Traits::XmmRegister src) {
442 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 453 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
443 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 454 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
455 emitAddrSizeOverridePrefix();
444 emitRex(RexTypeIrrelevant, dst, src); 456 emitRex(RexTypeIrrelevant, dst, src);
445 emitUint8(0x0F); 457 emitUint8(0x0F);
446 emitUint8(0x11); 458 emitUint8(0x11);
447 emitOperand(gprEncoding(src), dst); 459 emitOperand(gprEncoding(src), dst);
448 } 460 }
449 461
450 template <class Machine> 462 template <class Machine>
451 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 463 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
452 typename Traits::XmmRegister src) { 464 typename Traits::XmmRegister src) {
453 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 465 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 15 matching lines...) Expand all
469 emitUint8(0x6E); 481 emitUint8(0x6E);
470 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 482 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
471 } 483 }
472 484
473 template <class Machine> 485 template <class Machine>
474 void AssemblerX86Base<Machine>::movd(Type SrcTy, 486 void AssemblerX86Base<Machine>::movd(Type SrcTy,
475 typename Traits::XmmRegister dst, 487 typename Traits::XmmRegister dst,
476 const typename Traits::Address &src) { 488 const typename Traits::Address &src) {
477 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 489 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
478 emitUint8(0x66); 490 emitUint8(0x66);
491 emitAddrSizeOverridePrefix();
479 emitRex(SrcTy, src, dst); 492 emitRex(SrcTy, src, dst);
480 emitUint8(0x0F); 493 emitUint8(0x0F);
481 emitUint8(0x6E); 494 emitUint8(0x6E);
482 emitOperand(gprEncoding(dst), src); 495 emitOperand(gprEncoding(dst), src);
483 } 496 }
484 497
485 template <class Machine> 498 template <class Machine>
486 void AssemblerX86Base<Machine>::movd(Type DestTy, 499 void AssemblerX86Base<Machine>::movd(Type DestTy,
487 typename Traits::GPRRegister dst, 500 typename Traits::GPRRegister dst,
488 typename Traits::XmmRegister src) { 501 typename Traits::XmmRegister src) {
489 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 502 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
490 emitUint8(0x66); 503 emitUint8(0x66);
491 emitRexRB(DestTy, src, dst); 504 emitRexRB(DestTy, src, dst);
492 emitUint8(0x0F); 505 emitUint8(0x0F);
493 emitUint8(0x7E); 506 emitUint8(0x7E);
494 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); 507 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
495 } 508 }
496 509
497 template <class Machine> 510 template <class Machine>
498 void AssemblerX86Base<Machine>::movd(Type DestTy, 511 void AssemblerX86Base<Machine>::movd(Type DestTy,
499 const typename Traits::Address &dst, 512 const typename Traits::Address &dst,
500 typename Traits::XmmRegister src) { 513 typename Traits::XmmRegister src) {
501 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 514 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
502 emitUint8(0x66); 515 emitUint8(0x66);
516 emitAddrSizeOverridePrefix();
503 emitRex(DestTy, dst, src); 517 emitRex(DestTy, dst, src);
504 emitUint8(0x0F); 518 emitUint8(0x0F);
505 emitUint8(0x7E); 519 emitUint8(0x7E);
506 emitOperand(gprEncoding(src), dst); 520 emitOperand(gprEncoding(src), dst);
507 } 521 }
508 522
509 template <class Machine> 523 template <class Machine>
510 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 524 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
511 typename Traits::XmmRegister src) { 525 typename Traits::XmmRegister src) {
512 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 526 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
513 emitUint8(0xF3); 527 emitUint8(0xF3);
514 emitRexRB(RexTypeIrrelevant, dst, src); 528 emitRexRB(RexTypeIrrelevant, dst, src);
515 emitUint8(0x0F); 529 emitUint8(0x0F);
516 emitUint8(0x7E); 530 emitUint8(0x7E);
517 emitXmmRegisterOperand(dst, src); 531 emitXmmRegisterOperand(dst, src);
518 } 532 }
519 533
520 template <class Machine> 534 template <class Machine>
521 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst, 535 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst,
522 typename Traits::XmmRegister src) { 536 typename Traits::XmmRegister src) {
523 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 537 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
524 emitUint8(0x66); 538 emitUint8(0x66);
539 emitAddrSizeOverridePrefix();
525 emitRex(RexTypeIrrelevant, dst, src); 540 emitRex(RexTypeIrrelevant, dst, src);
526 emitUint8(0x0F); 541 emitUint8(0x0F);
527 emitUint8(0xD6); 542 emitUint8(0xD6);
528 emitOperand(gprEncoding(src), dst); 543 emitOperand(gprEncoding(src), dst);
529 } 544 }
530 545
531 template <class Machine> 546 template <class Machine>
532 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 547 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
533 const typename Traits::Address &src) { 548 const typename Traits::Address &src) {
534 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 549 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
535 emitUint8(0xF3); 550 emitUint8(0xF3);
551 emitAddrSizeOverridePrefix();
536 emitRex(RexTypeIrrelevant, src, dst); 552 emitRex(RexTypeIrrelevant, src, dst);
537 emitUint8(0x0F); 553 emitUint8(0x0F);
538 emitUint8(0x7E); 554 emitUint8(0x7E);
539 emitOperand(gprEncoding(dst), src); 555 emitOperand(gprEncoding(dst), src);
540 } 556 }
541 557
542 template <class Machine> 558 template <class Machine>
543 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 559 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
544 typename Traits::XmmRegister src) { 560 typename Traits::XmmRegister src) {
545 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 561 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
546 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 562 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
547 emitRexRB(RexTypeIrrelevant, dst, src); 563 emitRexRB(RexTypeIrrelevant, dst, src);
548 emitUint8(0x0F); 564 emitUint8(0x0F);
549 emitUint8(0x58); 565 emitUint8(0x58);
550 emitXmmRegisterOperand(dst, src); 566 emitXmmRegisterOperand(dst, src);
551 } 567 }
552 568
553 template <class Machine> 569 template <class Machine>
554 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 570 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
555 const typename Traits::Address &src) { 571 const typename Traits::Address &src) {
556 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 572 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
557 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 573 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
574 emitAddrSizeOverridePrefix();
558 emitRex(RexTypeIrrelevant, src, dst); 575 emitRex(RexTypeIrrelevant, src, dst);
559 emitUint8(0x0F); 576 emitUint8(0x0F);
560 emitUint8(0x58); 577 emitUint8(0x58);
561 emitOperand(gprEncoding(dst), src); 578 emitOperand(gprEncoding(dst), src);
562 } 579 }
563 580
564 template <class Machine> 581 template <class Machine>
565 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 582 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
566 typename Traits::XmmRegister src) { 583 typename Traits::XmmRegister src) {
567 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 584 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
568 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 585 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
569 emitRexRB(RexTypeIrrelevant, dst, src); 586 emitRexRB(RexTypeIrrelevant, dst, src);
570 emitUint8(0x0F); 587 emitUint8(0x0F);
571 emitUint8(0x5C); 588 emitUint8(0x5C);
572 emitXmmRegisterOperand(dst, src); 589 emitXmmRegisterOperand(dst, src);
573 } 590 }
574 591
575 template <class Machine> 592 template <class Machine>
576 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 593 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
577 const typename Traits::Address &src) { 594 const typename Traits::Address &src) {
578 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 595 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
579 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 596 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
597 emitAddrSizeOverridePrefix();
580 emitRex(RexTypeIrrelevant, src, dst); 598 emitRex(RexTypeIrrelevant, src, dst);
581 emitUint8(0x0F); 599 emitUint8(0x0F);
582 emitUint8(0x5C); 600 emitUint8(0x5C);
583 emitOperand(gprEncoding(dst), src); 601 emitOperand(gprEncoding(dst), src);
584 } 602 }
585 603
586 template <class Machine> 604 template <class Machine>
587 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 605 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
588 typename Traits::XmmRegister src) { 606 typename Traits::XmmRegister src) {
589 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 607 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
590 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 608 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
591 emitRexRB(RexTypeIrrelevant, dst, src); 609 emitRexRB(RexTypeIrrelevant, dst, src);
592 emitUint8(0x0F); 610 emitUint8(0x0F);
593 emitUint8(0x59); 611 emitUint8(0x59);
594 emitXmmRegisterOperand(dst, src); 612 emitXmmRegisterOperand(dst, src);
595 } 613 }
596 614
597 template <class Machine> 615 template <class Machine>
598 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 616 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
599 const typename Traits::Address &src) { 617 const typename Traits::Address &src) {
600 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 618 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
601 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 619 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
620 emitAddrSizeOverridePrefix();
602 emitRex(RexTypeIrrelevant, src, dst); 621 emitRex(RexTypeIrrelevant, src, dst);
603 emitUint8(0x0F); 622 emitUint8(0x0F);
604 emitUint8(0x59); 623 emitUint8(0x59);
605 emitOperand(gprEncoding(dst), src); 624 emitOperand(gprEncoding(dst), src);
606 } 625 }
607 626
608 template <class Machine> 627 template <class Machine>
609 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 628 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
610 typename Traits::XmmRegister src) { 629 typename Traits::XmmRegister src) {
611 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 630 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
612 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 631 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
613 emitRexRB(RexTypeIrrelevant, dst, src); 632 emitRexRB(RexTypeIrrelevant, dst, src);
614 emitUint8(0x0F); 633 emitUint8(0x0F);
615 emitUint8(0x5E); 634 emitUint8(0x5E);
616 emitXmmRegisterOperand(dst, src); 635 emitXmmRegisterOperand(dst, src);
617 } 636 }
618 637
619 template <class Machine> 638 template <class Machine>
620 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 639 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
621 const typename Traits::Address &src) { 640 const typename Traits::Address &src) {
622 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 641 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
623 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 642 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
643 emitAddrSizeOverridePrefix();
624 emitRex(RexTypeIrrelevant, src, dst); 644 emitRex(RexTypeIrrelevant, src, dst);
625 emitUint8(0x0F); 645 emitUint8(0x0F);
626 emitUint8(0x5E); 646 emitUint8(0x5E);
627 emitOperand(gprEncoding(dst), src); 647 emitOperand(gprEncoding(dst), src);
628 } 648 }
629 649
630 template <class Machine> 650 template <class Machine>
631 template <typename T, typename> 651 template <typename T, typename>
632 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) { 652 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) {
633 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 653 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
654 emitAddrSizeOverridePrefix();
634 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 655 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
635 emitOperand(0, src); 656 emitOperand(0, src);
636 } 657 }
637 658
638 template <class Machine> 659 template <class Machine>
639 template <typename T, typename> 660 template <typename T, typename>
640 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) { 661 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) {
641 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 662 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
663 emitAddrSizeOverridePrefix();
642 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 664 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
643 emitOperand(3, dst); 665 emitOperand(3, dst);
644 } 666 }
645 667
646 template <class Machine> 668 template <class Machine>
647 template <typename T, typename> 669 template <typename T, typename>
648 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) { 670 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) {
649 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 671 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
650 emitUint8(0xDD); 672 emitUint8(0xDD);
651 emitUint8(0xD8 + st); 673 emitUint8(0xD8 + st);
(...skipping 16 matching lines...) Expand all
668 emitRexRB(RexTypeIrrelevant, dst, src); 690 emitRexRB(RexTypeIrrelevant, dst, src);
669 emitUint8(0x0F); 691 emitUint8(0x0F);
670 emitUint8(0x10); 692 emitUint8(0x10);
671 emitXmmRegisterOperand(dst, src); 693 emitXmmRegisterOperand(dst, src);
672 } 694 }
673 695
674 template <class Machine> 696 template <class Machine>
675 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, 697 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
676 const typename Traits::Address &src) { 698 const typename Traits::Address &src) {
677 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 699 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
700 emitAddrSizeOverridePrefix();
678 emitRex(RexTypeIrrelevant, src, dst); 701 emitRex(RexTypeIrrelevant, src, dst);
679 emitUint8(0x0F); 702 emitUint8(0x0F);
680 emitUint8(0x10); 703 emitUint8(0x10);
681 emitOperand(gprEncoding(dst), src); 704 emitOperand(gprEncoding(dst), src);
682 } 705 }
683 706
684 template <class Machine> 707 template <class Machine>
685 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst, 708 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst,
686 typename Traits::XmmRegister src) { 709 typename Traits::XmmRegister src) {
687 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 710 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
711 emitAddrSizeOverridePrefix();
688 emitRex(RexTypeIrrelevant, dst, src); 712 emitRex(RexTypeIrrelevant, dst, src);
689 emitUint8(0x0F); 713 emitUint8(0x0F);
690 emitUint8(0x11); 714 emitUint8(0x11);
691 emitOperand(gprEncoding(src), dst); 715 emitOperand(gprEncoding(src), dst);
692 } 716 }
693 717
694 template <class Machine> 718 template <class Machine>
695 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 719 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
696 typename Traits::XmmRegister src) { 720 typename Traits::XmmRegister src) {
697 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 721 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
698 emitUint8(0x66); 722 emitUint8(0x66);
699 emitRexRB(RexTypeIrrelevant, dst, src); 723 emitRexRB(RexTypeIrrelevant, dst, src);
700 emitUint8(0x0F); 724 emitUint8(0x0F);
701 if (isByteSizedArithType(Ty)) { 725 if (isByteSizedArithType(Ty)) {
702 emitUint8(0xFC); 726 emitUint8(0xFC);
703 } else if (Ty == IceType_i16) { 727 } else if (Ty == IceType_i16) {
704 emitUint8(0xFD); 728 emitUint8(0xFD);
705 } else { 729 } else {
706 emitUint8(0xFE); 730 emitUint8(0xFE);
707 } 731 }
708 emitXmmRegisterOperand(dst, src); 732 emitXmmRegisterOperand(dst, src);
709 } 733 }
710 734
711 template <class Machine> 735 template <class Machine>
712 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 736 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
713 const typename Traits::Address &src) { 737 const typename Traits::Address &src) {
714 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 738 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
715 emitUint8(0x66); 739 emitUint8(0x66);
740 emitAddrSizeOverridePrefix();
716 emitRex(RexTypeIrrelevant, src, dst); 741 emitRex(RexTypeIrrelevant, src, dst);
717 emitUint8(0x0F); 742 emitUint8(0x0F);
718 if (isByteSizedArithType(Ty)) { 743 if (isByteSizedArithType(Ty)) {
719 emitUint8(0xFC); 744 emitUint8(0xFC);
720 } else if (Ty == IceType_i16) { 745 } else if (Ty == IceType_i16) {
721 emitUint8(0xFD); 746 emitUint8(0xFD);
722 } else { 747 } else {
723 emitUint8(0xFE); 748 emitUint8(0xFE);
724 } 749 }
725 emitOperand(gprEncoding(dst), src); 750 emitOperand(gprEncoding(dst), src);
(...skipping 10 matching lines...) Expand all
736 emitUint8(0xDB); 761 emitUint8(0xDB);
737 emitXmmRegisterOperand(dst, src); 762 emitXmmRegisterOperand(dst, src);
738 } 763 }
739 764
740 template <class Machine> 765 template <class Machine>
741 void AssemblerX86Base<Machine>::pand(Type /* Ty */, 766 void AssemblerX86Base<Machine>::pand(Type /* Ty */,
742 typename Traits::XmmRegister dst, 767 typename Traits::XmmRegister dst,
743 const typename Traits::Address &src) { 768 const typename Traits::Address &src) {
744 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 769 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
745 emitUint8(0x66); 770 emitUint8(0x66);
771 emitAddrSizeOverridePrefix();
746 emitRex(RexTypeIrrelevant, src, dst); 772 emitRex(RexTypeIrrelevant, src, dst);
747 emitUint8(0x0F); 773 emitUint8(0x0F);
748 emitUint8(0xDB); 774 emitUint8(0xDB);
749 emitOperand(gprEncoding(dst), src); 775 emitOperand(gprEncoding(dst), src);
750 } 776 }
751 777
752 template <class Machine> 778 template <class Machine>
753 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 779 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
754 typename Traits::XmmRegister dst, 780 typename Traits::XmmRegister dst,
755 typename Traits::XmmRegister src) { 781 typename Traits::XmmRegister src) {
756 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 782 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
757 emitUint8(0x66); 783 emitUint8(0x66);
758 emitRexRB(RexTypeIrrelevant, dst, src); 784 emitRexRB(RexTypeIrrelevant, dst, src);
759 emitUint8(0x0F); 785 emitUint8(0x0F);
760 emitUint8(0xDF); 786 emitUint8(0xDF);
761 emitXmmRegisterOperand(dst, src); 787 emitXmmRegisterOperand(dst, src);
762 } 788 }
763 789
764 template <class Machine> 790 template <class Machine>
765 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 791 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
766 typename Traits::XmmRegister dst, 792 typename Traits::XmmRegister dst,
767 const typename Traits::Address &src) { 793 const typename Traits::Address &src) {
768 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 794 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
769 emitUint8(0x66); 795 emitUint8(0x66);
796 emitAddrSizeOverridePrefix();
770 emitRex(RexTypeIrrelevant, src, dst); 797 emitRex(RexTypeIrrelevant, src, dst);
771 emitUint8(0x0F); 798 emitUint8(0x0F);
772 emitUint8(0xDF); 799 emitUint8(0xDF);
773 emitOperand(gprEncoding(dst), src); 800 emitOperand(gprEncoding(dst), src);
774 } 801 }
775 802
776 template <class Machine> 803 template <class Machine>
777 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 804 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
778 typename Traits::XmmRegister src) { 805 typename Traits::XmmRegister src) {
779 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 806 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
780 emitUint8(0x66); 807 emitUint8(0x66);
781 emitRexRB(RexTypeIrrelevant, dst, src); 808 emitRexRB(RexTypeIrrelevant, dst, src);
782 emitUint8(0x0F); 809 emitUint8(0x0F);
783 if (Ty == IceType_i16) { 810 if (Ty == IceType_i16) {
784 emitUint8(0xD5); 811 emitUint8(0xD5);
785 } else { 812 } else {
786 assert(Ty == IceType_i32); 813 assert(Ty == IceType_i32);
787 emitUint8(0x38); 814 emitUint8(0x38);
788 emitUint8(0x40); 815 emitUint8(0x40);
789 } 816 }
790 emitXmmRegisterOperand(dst, src); 817 emitXmmRegisterOperand(dst, src);
791 } 818 }
792 819
793 template <class Machine> 820 template <class Machine>
794 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 821 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
795 const typename Traits::Address &src) { 822 const typename Traits::Address &src) {
796 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 823 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
797 emitUint8(0x66); 824 emitUint8(0x66);
825 emitAddrSizeOverridePrefix();
798 emitRex(RexTypeIrrelevant, src, dst); 826 emitRex(RexTypeIrrelevant, src, dst);
799 emitUint8(0x0F); 827 emitUint8(0x0F);
800 if (Ty == IceType_i16) { 828 if (Ty == IceType_i16) {
801 emitUint8(0xD5); 829 emitUint8(0xD5);
802 } else { 830 } else {
803 assert(Ty == IceType_i32); 831 assert(Ty == IceType_i32);
804 emitUint8(0x38); 832 emitUint8(0x38);
805 emitUint8(0x40); 833 emitUint8(0x40);
806 } 834 }
807 emitOperand(gprEncoding(dst), src); 835 emitOperand(gprEncoding(dst), src);
(...skipping 10 matching lines...) Expand all
818 emitUint8(0xF4); 846 emitUint8(0xF4);
819 emitXmmRegisterOperand(dst, src); 847 emitXmmRegisterOperand(dst, src);
820 } 848 }
821 849
822 template <class Machine> 850 template <class Machine>
823 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, 851 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
824 typename Traits::XmmRegister dst, 852 typename Traits::XmmRegister dst,
825 const typename Traits::Address &src) { 853 const typename Traits::Address &src) {
826 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 854 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
827 emitUint8(0x66); 855 emitUint8(0x66);
856 emitAddrSizeOverridePrefix();
828 emitRex(RexTypeIrrelevant, src, dst); 857 emitRex(RexTypeIrrelevant, src, dst);
829 emitUint8(0x0F); 858 emitUint8(0x0F);
830 emitUint8(0xF4); 859 emitUint8(0xF4);
831 emitOperand(gprEncoding(dst), src); 860 emitOperand(gprEncoding(dst), src);
832 } 861 }
833 862
834 template <class Machine> 863 template <class Machine>
835 void AssemblerX86Base<Machine>::por(Type /* Ty */, 864 void AssemblerX86Base<Machine>::por(Type /* Ty */,
836 typename Traits::XmmRegister dst, 865 typename Traits::XmmRegister dst,
837 typename Traits::XmmRegister src) { 866 typename Traits::XmmRegister src) {
838 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 867 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
839 emitUint8(0x66); 868 emitUint8(0x66);
840 emitRexRB(RexTypeIrrelevant, dst, src); 869 emitRexRB(RexTypeIrrelevant, dst, src);
841 emitUint8(0x0F); 870 emitUint8(0x0F);
842 emitUint8(0xEB); 871 emitUint8(0xEB);
843 emitXmmRegisterOperand(dst, src); 872 emitXmmRegisterOperand(dst, src);
844 } 873 }
845 874
846 template <class Machine> 875 template <class Machine>
847 void AssemblerX86Base<Machine>::por(Type /* Ty */, 876 void AssemblerX86Base<Machine>::por(Type /* Ty */,
848 typename Traits::XmmRegister dst, 877 typename Traits::XmmRegister dst,
849 const typename Traits::Address &src) { 878 const typename Traits::Address &src) {
850 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 879 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
851 emitUint8(0x66); 880 emitUint8(0x66);
881 emitAddrSizeOverridePrefix();
852 emitRex(RexTypeIrrelevant, src, dst); 882 emitRex(RexTypeIrrelevant, src, dst);
853 emitUint8(0x0F); 883 emitUint8(0x0F);
854 emitUint8(0xEB); 884 emitUint8(0xEB);
855 emitOperand(gprEncoding(dst), src); 885 emitOperand(gprEncoding(dst), src);
856 } 886 }
857 887
858 template <class Machine> 888 template <class Machine>
859 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 889 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
860 typename Traits::XmmRegister src) { 890 typename Traits::XmmRegister src) {
861 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 891 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
862 emitUint8(0x66); 892 emitUint8(0x66);
863 emitRexRB(RexTypeIrrelevant, dst, src); 893 emitRexRB(RexTypeIrrelevant, dst, src);
864 emitUint8(0x0F); 894 emitUint8(0x0F);
865 if (isByteSizedArithType(Ty)) { 895 if (isByteSizedArithType(Ty)) {
866 emitUint8(0xF8); 896 emitUint8(0xF8);
867 } else if (Ty == IceType_i16) { 897 } else if (Ty == IceType_i16) {
868 emitUint8(0xF9); 898 emitUint8(0xF9);
869 } else { 899 } else {
870 emitUint8(0xFA); 900 emitUint8(0xFA);
871 } 901 }
872 emitXmmRegisterOperand(dst, src); 902 emitXmmRegisterOperand(dst, src);
873 } 903 }
874 904
875 template <class Machine> 905 template <class Machine>
876 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 906 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
877 const typename Traits::Address &src) { 907 const typename Traits::Address &src) {
878 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 908 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
879 emitUint8(0x66); 909 emitUint8(0x66);
910 emitAddrSizeOverridePrefix();
880 emitRex(RexTypeIrrelevant, src, dst); 911 emitRex(RexTypeIrrelevant, src, dst);
881 emitUint8(0x0F); 912 emitUint8(0x0F);
882 if (isByteSizedArithType(Ty)) { 913 if (isByteSizedArithType(Ty)) {
883 emitUint8(0xF8); 914 emitUint8(0xF8);
884 } else if (Ty == IceType_i16) { 915 } else if (Ty == IceType_i16) {
885 emitUint8(0xF9); 916 emitUint8(0xF9);
886 } else { 917 } else {
887 emitUint8(0xFA); 918 emitUint8(0xFA);
888 } 919 }
889 emitOperand(gprEncoding(dst), src); 920 emitOperand(gprEncoding(dst), src);
(...skipping 10 matching lines...) Expand all
900 emitUint8(0xEF); 931 emitUint8(0xEF);
901 emitXmmRegisterOperand(dst, src); 932 emitXmmRegisterOperand(dst, src);
902 } 933 }
903 934
904 template <class Machine> 935 template <class Machine>
905 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, 936 void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
906 typename Traits::XmmRegister dst, 937 typename Traits::XmmRegister dst,
907 const typename Traits::Address &src) { 938 const typename Traits::Address &src) {
908 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 939 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
909 emitUint8(0x66); 940 emitUint8(0x66);
941 emitAddrSizeOverridePrefix();
910 emitRex(RexTypeIrrelevant, src, dst); 942 emitRex(RexTypeIrrelevant, src, dst);
911 emitUint8(0x0F); 943 emitUint8(0x0F);
912 emitUint8(0xEF); 944 emitUint8(0xEF);
913 emitOperand(gprEncoding(dst), src); 945 emitOperand(gprEncoding(dst), src);
914 } 946 }
915 947
916 template <class Machine> 948 template <class Machine>
917 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 949 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
918 typename Traits::XmmRegister src) { 950 typename Traits::XmmRegister src) {
919 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 951 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
920 emitUint8(0x66); 952 emitUint8(0x66);
921 emitRexRB(RexTypeIrrelevant, dst, src); 953 emitRexRB(RexTypeIrrelevant, dst, src);
922 emitUint8(0x0F); 954 emitUint8(0x0F);
923 if (Ty == IceType_i16) { 955 if (Ty == IceType_i16) {
924 emitUint8(0xF1); 956 emitUint8(0xF1);
925 } else { 957 } else {
926 assert(Ty == IceType_i32); 958 assert(Ty == IceType_i32);
927 emitUint8(0xF2); 959 emitUint8(0xF2);
928 } 960 }
929 emitXmmRegisterOperand(dst, src); 961 emitXmmRegisterOperand(dst, src);
930 } 962 }
931 963
932 template <class Machine> 964 template <class Machine>
933 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 965 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
934 const typename Traits::Address &src) { 966 const typename Traits::Address &src) {
935 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 967 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
936 emitUint8(0x66); 968 emitUint8(0x66);
969 emitAddrSizeOverridePrefix();
937 emitRex(RexTypeIrrelevant, src, dst); 970 emitRex(RexTypeIrrelevant, src, dst);
938 emitUint8(0x0F); 971 emitUint8(0x0F);
939 if (Ty == IceType_i16) { 972 if (Ty == IceType_i16) {
940 emitUint8(0xF1); 973 emitUint8(0xF1);
941 } else { 974 } else {
942 assert(Ty == IceType_i32); 975 assert(Ty == IceType_i32);
943 emitUint8(0xF2); 976 emitUint8(0xF2);
944 } 977 }
945 emitOperand(gprEncoding(dst), src); 978 emitOperand(gprEncoding(dst), src);
946 } 979 }
(...skipping 30 matching lines...) Expand all
977 emitUint8(0xE2); 1010 emitUint8(0xE2);
978 } 1011 }
979 emitXmmRegisterOperand(dst, src); 1012 emitXmmRegisterOperand(dst, src);
980 } 1013 }
981 1014
982 template <class Machine> 1015 template <class Machine>
983 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 1016 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
984 const typename Traits::Address &src) { 1017 const typename Traits::Address &src) {
985 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1018 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
986 emitUint8(0x66); 1019 emitUint8(0x66);
1020 emitAddrSizeOverridePrefix();
987 emitRex(RexTypeIrrelevant, src, dst); 1021 emitRex(RexTypeIrrelevant, src, dst);
988 emitUint8(0x0F); 1022 emitUint8(0x0F);
989 if (Ty == IceType_i16) { 1023 if (Ty == IceType_i16) {
990 emitUint8(0xE1); 1024 emitUint8(0xE1);
991 } else { 1025 } else {
992 assert(Ty == IceType_i32); 1026 assert(Ty == IceType_i32);
993 emitUint8(0xE2); 1027 emitUint8(0xE2);
994 } 1028 }
995 emitOperand(gprEncoding(dst), src); 1029 emitOperand(gprEncoding(dst), src);
996 } 1030 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 emitUint8(0xD2); 1063 emitUint8(0xD2);
1030 } 1064 }
1031 emitXmmRegisterOperand(dst, src); 1065 emitXmmRegisterOperand(dst, src);
1032 } 1066 }
1033 1067
1034 template <class Machine> 1068 template <class Machine>
1035 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 1069 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
1036 const typename Traits::Address &src) { 1070 const typename Traits::Address &src) {
1037 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1071 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1038 emitUint8(0x66); 1072 emitUint8(0x66);
1073 emitAddrSizeOverridePrefix();
1039 emitRex(RexTypeIrrelevant, src, dst); 1074 emitRex(RexTypeIrrelevant, src, dst);
1040 emitUint8(0x0F); 1075 emitUint8(0x0F);
1041 if (Ty == IceType_i16) { 1076 if (Ty == IceType_i16) {
1042 emitUint8(0xD1); 1077 emitUint8(0xD1);
1043 } else if (Ty == IceType_f64) { 1078 } else if (Ty == IceType_f64) {
1044 emitUint8(0xD3); 1079 emitUint8(0xD3);
1045 } else { 1080 } else {
1046 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 1081 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
1047 emitUint8(0xD2); 1082 emitUint8(0xD2);
1048 } 1083 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 emitUint8(0x0F); 1116 emitUint8(0x0F);
1082 emitUint8(0x58); 1117 emitUint8(0x58);
1083 emitXmmRegisterOperand(dst, src); 1118 emitXmmRegisterOperand(dst, src);
1084 } 1119 }
1085 1120
1086 template <class Machine> 1121 template <class Machine>
1087 void AssemblerX86Base<Machine>::addps(Type /* Ty */, 1122 void AssemblerX86Base<Machine>::addps(Type /* Ty */,
1088 typename Traits::XmmRegister dst, 1123 typename Traits::XmmRegister dst,
1089 const typename Traits::Address &src) { 1124 const typename Traits::Address &src) {
1090 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1125 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1126 emitAddrSizeOverridePrefix();
1091 emitRex(RexTypeIrrelevant, src, dst); 1127 emitRex(RexTypeIrrelevant, src, dst);
1092 emitUint8(0x0F); 1128 emitUint8(0x0F);
1093 emitUint8(0x58); 1129 emitUint8(0x58);
1094 emitOperand(gprEncoding(dst), src); 1130 emitOperand(gprEncoding(dst), src);
1095 } 1131 }
1096 1132
1097 template <class Machine> 1133 template <class Machine>
1098 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1134 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
1099 typename Traits::XmmRegister dst, 1135 typename Traits::XmmRegister dst,
1100 typename Traits::XmmRegister src) { 1136 typename Traits::XmmRegister src) {
1101 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1137 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1102 emitRexRB(RexTypeIrrelevant, dst, src); 1138 emitRexRB(RexTypeIrrelevant, dst, src);
1103 emitUint8(0x0F); 1139 emitUint8(0x0F);
1104 emitUint8(0x5C); 1140 emitUint8(0x5C);
1105 emitXmmRegisterOperand(dst, src); 1141 emitXmmRegisterOperand(dst, src);
1106 } 1142 }
1107 1143
1108 template <class Machine> 1144 template <class Machine>
1109 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1145 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
1110 typename Traits::XmmRegister dst, 1146 typename Traits::XmmRegister dst,
1111 const typename Traits::Address &src) { 1147 const typename Traits::Address &src) {
1112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1148 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1149 emitAddrSizeOverridePrefix();
1113 emitRex(RexTypeIrrelevant, src, dst); 1150 emitRex(RexTypeIrrelevant, src, dst);
1114 emitUint8(0x0F); 1151 emitUint8(0x0F);
1115 emitUint8(0x5C); 1152 emitUint8(0x5C);
1116 emitOperand(gprEncoding(dst), src); 1153 emitOperand(gprEncoding(dst), src);
1117 } 1154 }
1118 1155
1119 template <class Machine> 1156 template <class Machine>
1120 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1157 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
1121 typename Traits::XmmRegister dst, 1158 typename Traits::XmmRegister dst,
1122 typename Traits::XmmRegister src) { 1159 typename Traits::XmmRegister src) {
1123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1160 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1124 emitRexRB(RexTypeIrrelevant, dst, src); 1161 emitRexRB(RexTypeIrrelevant, dst, src);
1125 emitUint8(0x0F); 1162 emitUint8(0x0F);
1126 emitUint8(0x5E); 1163 emitUint8(0x5E);
1127 emitXmmRegisterOperand(dst, src); 1164 emitXmmRegisterOperand(dst, src);
1128 } 1165 }
1129 1166
1130 template <class Machine> 1167 template <class Machine>
1131 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1168 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
1132 typename Traits::XmmRegister dst, 1169 typename Traits::XmmRegister dst,
1133 const typename Traits::Address &src) { 1170 const typename Traits::Address &src) {
1134 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1171 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1172 emitAddrSizeOverridePrefix();
1135 emitRex(RexTypeIrrelevant, src, dst); 1173 emitRex(RexTypeIrrelevant, src, dst);
1136 emitUint8(0x0F); 1174 emitUint8(0x0F);
1137 emitUint8(0x5E); 1175 emitUint8(0x5E);
1138 emitOperand(gprEncoding(dst), src); 1176 emitOperand(gprEncoding(dst), src);
1139 } 1177 }
1140 1178
1141 template <class Machine> 1179 template <class Machine>
1142 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1180 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1143 typename Traits::XmmRegister dst, 1181 typename Traits::XmmRegister dst,
1144 typename Traits::XmmRegister src) { 1182 typename Traits::XmmRegister src) {
1145 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1183 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1146 emitRexRB(RexTypeIrrelevant, dst, src); 1184 emitRexRB(RexTypeIrrelevant, dst, src);
1147 emitUint8(0x0F); 1185 emitUint8(0x0F);
1148 emitUint8(0x59); 1186 emitUint8(0x59);
1149 emitXmmRegisterOperand(dst, src); 1187 emitXmmRegisterOperand(dst, src);
1150 } 1188 }
1151 1189
1152 template <class Machine> 1190 template <class Machine>
1153 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1191 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1154 typename Traits::XmmRegister dst, 1192 typename Traits::XmmRegister dst,
1155 const typename Traits::Address &src) { 1193 const typename Traits::Address &src) {
1156 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1194 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1195 emitAddrSizeOverridePrefix();
1157 emitRex(RexTypeIrrelevant, src, dst); 1196 emitRex(RexTypeIrrelevant, src, dst);
1158 emitUint8(0x0F); 1197 emitUint8(0x0F);
1159 emitUint8(0x59); 1198 emitUint8(0x59);
1160 emitOperand(gprEncoding(dst), src); 1199 emitOperand(gprEncoding(dst), src);
1161 } 1200 }
1162 1201
1163 template <class Machine> 1202 template <class Machine>
1164 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, 1203 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst,
1165 typename Traits::XmmRegister src) { 1204 typename Traits::XmmRegister src) {
1166 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1205 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1167 if (!isFloat32Asserting32Or64(Ty)) 1206 if (!isFloat32Asserting32Or64(Ty))
1168 emitUint8(0x66); 1207 emitUint8(0x66);
1169 emitRexRB(RexTypeIrrelevant, dst, src); 1208 emitRexRB(RexTypeIrrelevant, dst, src);
1170 emitUint8(0x0F); 1209 emitUint8(0x0F);
1171 emitUint8(0x5D); 1210 emitUint8(0x5D);
1172 emitXmmRegisterOperand(dst, src); 1211 emitXmmRegisterOperand(dst, src);
1173 } 1212 }
1174 1213
1175 template <class Machine> 1214 template <class Machine>
1176 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst, 1215 void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst,
1177 const typename Traits::Address &src) { 1216 const typename Traits::Address &src) {
1178 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1217 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1179 if (!isFloat32Asserting32Or64(Ty)) 1218 if (!isFloat32Asserting32Or64(Ty))
1180 emitUint8(0x66); 1219 emitUint8(0x66);
1220 emitAddrSizeOverridePrefix();
1181 emitRex(RexTypeIrrelevant, src, dst); 1221 emitRex(RexTypeIrrelevant, src, dst);
1182 emitUint8(0x0F); 1222 emitUint8(0x0F);
1183 emitUint8(0x5D); 1223 emitUint8(0x5D);
1184 emitOperand(gprEncoding(dst), src); 1224 emitOperand(gprEncoding(dst), src);
1185 } 1225 }
1186 1226
1187 template <class Machine> 1227 template <class Machine>
1188 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, 1228 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst,
1189 typename Traits::XmmRegister src) { 1229 typename Traits::XmmRegister src) {
1190 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1230 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1191 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1231 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1192 emitRexRB(RexTypeIrrelevant, dst, src); 1232 emitRexRB(RexTypeIrrelevant, dst, src);
1193 emitUint8(0x0F); 1233 emitUint8(0x0F);
1194 emitUint8(0x5D); 1234 emitUint8(0x5D);
1195 emitXmmRegisterOperand(dst, src); 1235 emitXmmRegisterOperand(dst, src);
1196 } 1236 }
1197 1237
1198 template <class Machine> 1238 template <class Machine>
1199 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst, 1239 void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst,
1200 const typename Traits::Address &src) { 1240 const typename Traits::Address &src) {
1201 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1241 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1202 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1242 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1243 emitAddrSizeOverridePrefix();
1203 emitRex(RexTypeIrrelevant, src, dst); 1244 emitRex(RexTypeIrrelevant, src, dst);
1204 emitUint8(0x0F); 1245 emitUint8(0x0F);
1205 emitUint8(0x5D); 1246 emitUint8(0x5D);
1206 emitOperand(gprEncoding(dst), src); 1247 emitOperand(gprEncoding(dst), src);
1207 } 1248 }
1208 1249
1209 template <class Machine> 1250 template <class Machine>
1210 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, 1251 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst,
1211 typename Traits::XmmRegister src) { 1252 typename Traits::XmmRegister src) {
1212 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1253 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1213 if (!isFloat32Asserting32Or64(Ty)) 1254 if (!isFloat32Asserting32Or64(Ty))
1214 emitUint8(0x66); 1255 emitUint8(0x66);
1215 emitRexRB(RexTypeIrrelevant, dst, src); 1256 emitRexRB(RexTypeIrrelevant, dst, src);
1216 emitUint8(0x0F); 1257 emitUint8(0x0F);
1217 emitUint8(0x5F); 1258 emitUint8(0x5F);
1218 emitXmmRegisterOperand(dst, src); 1259 emitXmmRegisterOperand(dst, src);
1219 } 1260 }
1220 1261
1221 template <class Machine> 1262 template <class Machine>
1222 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst, 1263 void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst,
1223 const typename Traits::Address &src) { 1264 const typename Traits::Address &src) {
1224 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1265 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1225 if (!isFloat32Asserting32Or64(Ty)) 1266 if (!isFloat32Asserting32Or64(Ty))
1226 emitUint8(0x66); 1267 emitUint8(0x66);
1268 emitAddrSizeOverridePrefix();
1227 emitRex(RexTypeIrrelevant, src, dst); 1269 emitRex(RexTypeIrrelevant, src, dst);
1228 emitUint8(0x0F); 1270 emitUint8(0x0F);
1229 emitUint8(0x5F); 1271 emitUint8(0x5F);
1230 emitOperand(gprEncoding(dst), src); 1272 emitOperand(gprEncoding(dst), src);
1231 } 1273 }
1232 1274
1233 template <class Machine> 1275 template <class Machine>
1234 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, 1276 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst,
1235 typename Traits::XmmRegister src) { 1277 typename Traits::XmmRegister src) {
1236 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1278 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1237 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1279 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1238 emitRexRB(RexTypeIrrelevant, dst, src); 1280 emitRexRB(RexTypeIrrelevant, dst, src);
1239 emitUint8(0x0F); 1281 emitUint8(0x0F);
1240 emitUint8(0x5F); 1282 emitUint8(0x5F);
1241 emitXmmRegisterOperand(dst, src); 1283 emitXmmRegisterOperand(dst, src);
1242 } 1284 }
1243 1285
1244 template <class Machine> 1286 template <class Machine>
1245 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst, 1287 void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst,
1246 const typename Traits::Address &src) { 1288 const typename Traits::Address &src) {
1247 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1289 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1248 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1290 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1291 emitAddrSizeOverridePrefix();
1249 emitRex(RexTypeIrrelevant, src, dst); 1292 emitRex(RexTypeIrrelevant, src, dst);
1250 emitUint8(0x0F); 1293 emitUint8(0x0F);
1251 emitUint8(0x5F); 1294 emitUint8(0x5F);
1252 emitOperand(gprEncoding(dst), src); 1295 emitOperand(gprEncoding(dst), src);
1253 } 1296 }
1254 1297
1255 template <class Machine> 1298 template <class Machine>
1256 void AssemblerX86Base<Machine>::andnps(Type Ty, 1299 void AssemblerX86Base<Machine>::andnps(Type Ty,
1257 typename Traits::XmmRegister dst, 1300 typename Traits::XmmRegister dst,
1258 typename Traits::XmmRegister src) { 1301 typename Traits::XmmRegister src) {
1259 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1302 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1260 if (!isFloat32Asserting32Or64(Ty)) 1303 if (!isFloat32Asserting32Or64(Ty))
1261 emitUint8(0x66); 1304 emitUint8(0x66);
1262 emitRexRB(RexTypeIrrelevant, dst, src); 1305 emitRexRB(RexTypeIrrelevant, dst, src);
1263 emitUint8(0x0F); 1306 emitUint8(0x0F);
1264 emitUint8(0x55); 1307 emitUint8(0x55);
1265 emitXmmRegisterOperand(dst, src); 1308 emitXmmRegisterOperand(dst, src);
1266 } 1309 }
1267 1310
1268 template <class Machine> 1311 template <class Machine>
1269 void AssemblerX86Base<Machine>::andnps(Type Ty, 1312 void AssemblerX86Base<Machine>::andnps(Type Ty,
1270 typename Traits::XmmRegister dst, 1313 typename Traits::XmmRegister dst,
1271 const typename Traits::Address &src) { 1314 const typename Traits::Address &src) {
1272 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1315 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1273 if (!isFloat32Asserting32Or64(Ty)) 1316 if (!isFloat32Asserting32Or64(Ty))
1274 emitUint8(0x66); 1317 emitUint8(0x66);
1318 emitAddrSizeOverridePrefix();
1275 emitRex(RexTypeIrrelevant, src, dst); 1319 emitRex(RexTypeIrrelevant, src, dst);
1276 emitUint8(0x0F); 1320 emitUint8(0x0F);
1277 emitUint8(0x55); 1321 emitUint8(0x55);
1278 emitOperand(gprEncoding(dst), src); 1322 emitOperand(gprEncoding(dst), src);
1279 } 1323 }
1280 1324
1281 template <class Machine> 1325 template <class Machine>
1282 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, 1326 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst,
1283 typename Traits::XmmRegister src) { 1327 typename Traits::XmmRegister src) {
1284 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1328 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1285 if (!isFloat32Asserting32Or64(Ty)) 1329 if (!isFloat32Asserting32Or64(Ty))
1286 emitUint8(0x66); 1330 emitUint8(0x66);
1287 emitRexRB(RexTypeIrrelevant, dst, src); 1331 emitRexRB(RexTypeIrrelevant, dst, src);
1288 emitUint8(0x0F); 1332 emitUint8(0x0F);
1289 emitUint8(0x54); 1333 emitUint8(0x54);
1290 emitXmmRegisterOperand(dst, src); 1334 emitXmmRegisterOperand(dst, src);
1291 } 1335 }
1292 1336
1293 template <class Machine> 1337 template <class Machine>
1294 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst, 1338 void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst,
1295 const typename Traits::Address &src) { 1339 const typename Traits::Address &src) {
1296 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1340 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1297 if (!isFloat32Asserting32Or64(Ty)) 1341 if (!isFloat32Asserting32Or64(Ty))
1298 emitUint8(0x66); 1342 emitUint8(0x66);
1343 emitAddrSizeOverridePrefix();
1299 emitRex(RexTypeIrrelevant, src, dst); 1344 emitRex(RexTypeIrrelevant, src, dst);
1300 emitUint8(0x0F); 1345 emitUint8(0x0F);
1301 emitUint8(0x54); 1346 emitUint8(0x54);
1302 emitOperand(gprEncoding(dst), src); 1347 emitOperand(gprEncoding(dst), src);
1303 } 1348 }
1304 1349
1305 template <class Machine> 1350 template <class Machine>
1306 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, 1351 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst,
1307 typename Traits::XmmRegister src) { 1352 typename Traits::XmmRegister src) {
1308 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1353 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1309 if (!isFloat32Asserting32Or64(Ty)) 1354 if (!isFloat32Asserting32Or64(Ty))
1310 emitUint8(0x66); 1355 emitUint8(0x66);
1311 emitRexRB(RexTypeIrrelevant, dst, src); 1356 emitRexRB(RexTypeIrrelevant, dst, src);
1312 emitUint8(0x0F); 1357 emitUint8(0x0F);
1313 emitUint8(0x56); 1358 emitUint8(0x56);
1314 emitXmmRegisterOperand(dst, src); 1359 emitXmmRegisterOperand(dst, src);
1315 } 1360 }
1316 1361
1317 template <class Machine> 1362 template <class Machine>
1318 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst, 1363 void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst,
1319 const typename Traits::Address &src) { 1364 const typename Traits::Address &src) {
1320 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1365 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1321 if (!isFloat32Asserting32Or64(Ty)) 1366 if (!isFloat32Asserting32Or64(Ty))
1322 emitUint8(0x66); 1367 emitUint8(0x66);
1368 emitAddrSizeOverridePrefix();
1323 emitRex(RexTypeIrrelevant, src, dst); 1369 emitRex(RexTypeIrrelevant, src, dst);
1324 emitUint8(0x0F); 1370 emitUint8(0x0F);
1325 emitUint8(0x56); 1371 emitUint8(0x56);
1326 emitOperand(gprEncoding(dst), src); 1372 emitOperand(gprEncoding(dst), src);
1327 } 1373 }
1328 1374
1329 template <class Machine> 1375 template <class Machine>
1330 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1376 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1331 typename Traits::XmmRegister dst, 1377 typename Traits::XmmRegister dst,
1332 typename Traits::XmmRegister src) { 1378 typename Traits::XmmRegister src) {
1333 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1379 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1334 emitUint8(0x66); 1380 emitUint8(0x66);
1335 emitRexRB(RexTypeIrrelevant, dst, src); 1381 emitRexRB(RexTypeIrrelevant, dst, src);
1336 emitUint8(0x0F); 1382 emitUint8(0x0F);
1337 emitUint8(0x38); 1383 emitUint8(0x38);
1338 emitUint8(0x14); 1384 emitUint8(0x14);
1339 emitXmmRegisterOperand(dst, src); 1385 emitXmmRegisterOperand(dst, src);
1340 } 1386 }
1341 1387
1342 template <class Machine> 1388 template <class Machine>
1343 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1389 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1344 typename Traits::XmmRegister dst, 1390 typename Traits::XmmRegister dst,
1345 const typename Traits::Address &src) { 1391 const typename Traits::Address &src) {
1346 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1392 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1347 emitUint8(0x66); 1393 emitUint8(0x66);
1394 emitAddrSizeOverridePrefix();
1348 emitRex(RexTypeIrrelevant, src, dst); 1395 emitRex(RexTypeIrrelevant, src, dst);
1349 emitUint8(0x0F); 1396 emitUint8(0x0F);
1350 emitUint8(0x38); 1397 emitUint8(0x38);
1351 emitUint8(0x14); 1398 emitUint8(0x14);
1352 emitOperand(gprEncoding(dst), src); 1399 emitOperand(gprEncoding(dst), src);
1353 } 1400 }
1354 1401
1355 template <class Machine> 1402 template <class Machine>
1356 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1403 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1357 typename Traits::XmmRegister dst, 1404 typename Traits::XmmRegister dst,
1358 typename Traits::XmmRegister src) { 1405 typename Traits::XmmRegister src) {
1359 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1406 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1360 emitUint8(0x66); 1407 emitUint8(0x66);
1361 emitRexRB(RexTypeIrrelevant, dst, src); 1408 emitRexRB(RexTypeIrrelevant, dst, src);
1362 emitUint8(0x0F); 1409 emitUint8(0x0F);
1363 emitUint8(0x38); 1410 emitUint8(0x38);
1364 emitUint8(0x10); 1411 emitUint8(0x10);
1365 emitXmmRegisterOperand(dst, src); 1412 emitXmmRegisterOperand(dst, src);
1366 } 1413 }
1367 1414
1368 template <class Machine> 1415 template <class Machine>
1369 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1416 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1370 typename Traits::XmmRegister dst, 1417 typename Traits::XmmRegister dst,
1371 const typename Traits::Address &src) { 1418 const typename Traits::Address &src) {
1372 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1419 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1373 emitUint8(0x66); 1420 emitUint8(0x66);
1421 emitAddrSizeOverridePrefix();
1374 emitRex(RexTypeIrrelevant, src, dst); 1422 emitRex(RexTypeIrrelevant, src, dst);
1375 emitUint8(0x0F); 1423 emitUint8(0x0F);
1376 emitUint8(0x38); 1424 emitUint8(0x38);
1377 emitUint8(0x10); 1425 emitUint8(0x10);
1378 emitOperand(gprEncoding(dst), src); 1426 emitOperand(gprEncoding(dst), src);
1379 } 1427 }
1380 1428
1381 template <class Machine> 1429 template <class Machine>
1382 void AssemblerX86Base<Machine>::cmpps( 1430 void AssemblerX86Base<Machine>::cmpps(
1383 Type Ty, typename Traits::XmmRegister dst, typename Traits::XmmRegister src, 1431 Type Ty, typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
1384 typename Traits::Cond::CmppsCond CmpCondition) { 1432 typename Traits::Cond::CmppsCond CmpCondition) {
1385 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1433 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1386 if (Ty == IceType_f64) 1434 if (Ty == IceType_f64)
1387 emitUint8(0x66); 1435 emitUint8(0x66);
1388 emitRexRB(RexTypeIrrelevant, dst, src); 1436 emitRexRB(RexTypeIrrelevant, dst, src);
1389 emitUint8(0x0F); 1437 emitUint8(0x0F);
1390 emitUint8(0xC2); 1438 emitUint8(0xC2);
1391 emitXmmRegisterOperand(dst, src); 1439 emitXmmRegisterOperand(dst, src);
1392 emitUint8(CmpCondition); 1440 emitUint8(CmpCondition);
1393 } 1441 }
1394 1442
1395 template <class Machine> 1443 template <class Machine>
1396 void AssemblerX86Base<Machine>::cmpps( 1444 void AssemblerX86Base<Machine>::cmpps(
1397 Type Ty, typename Traits::XmmRegister dst, 1445 Type Ty, typename Traits::XmmRegister dst,
1398 const typename Traits::Address &src, 1446 const typename Traits::Address &src,
1399 typename Traits::Cond::CmppsCond CmpCondition) { 1447 typename Traits::Cond::CmppsCond CmpCondition) {
1400 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1448 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1401 if (Ty == IceType_f64) 1449 if (Ty == IceType_f64)
1402 emitUint8(0x66); 1450 emitUint8(0x66);
1451 emitAddrSizeOverridePrefix();
1403 emitRex(RexTypeIrrelevant, src, dst); 1452 emitRex(RexTypeIrrelevant, src, dst);
1404 emitUint8(0x0F); 1453 emitUint8(0x0F);
1405 emitUint8(0xC2); 1454 emitUint8(0xC2);
1406 emitOperand(gprEncoding(dst), src); 1455 emitOperand(gprEncoding(dst), src);
1407 emitUint8(CmpCondition); 1456 emitUint8(CmpCondition);
1408 } 1457 }
1409 1458
1410 template <class Machine> 1459 template <class Machine>
1411 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) { 1460 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) {
1412 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1461 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 emitUint8(imm.value()); 1572 emitUint8(imm.value());
1524 } 1573 }
1525 1574
1526 template <class Machine> 1575 template <class Machine>
1527 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1576 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1528 typename Traits::XmmRegister dst, 1577 typename Traits::XmmRegister dst,
1529 const typename Traits::Address &src, 1578 const typename Traits::Address &src,
1530 const Immediate &imm) { 1579 const Immediate &imm) {
1531 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1580 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1532 emitUint8(0x66); 1581 emitUint8(0x66);
1582 emitAddrSizeOverridePrefix();
1533 emitRex(RexTypeIrrelevant, src, dst); 1583 emitRex(RexTypeIrrelevant, src, dst);
1534 emitUint8(0x0F); 1584 emitUint8(0x0F);
1535 emitUint8(0x70); 1585 emitUint8(0x70);
1536 emitOperand(gprEncoding(dst), src); 1586 emitOperand(gprEncoding(dst), src);
1537 assert(imm.is_uint8()); 1587 assert(imm.is_uint8());
1538 emitUint8(imm.value()); 1588 emitUint8(imm.value());
1539 } 1589 }
1540 1590
1541 template <class Machine> 1591 template <class Machine>
1542 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1592 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1543 typename Traits::XmmRegister dst, 1593 typename Traits::XmmRegister dst,
1544 typename Traits::XmmRegister src, 1594 typename Traits::XmmRegister src,
1545 const Immediate &imm) { 1595 const Immediate &imm) {
1546 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1596 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1547 emitRexRB(RexTypeIrrelevant, dst, src); 1597 emitRexRB(RexTypeIrrelevant, dst, src);
1548 emitUint8(0x0F); 1598 emitUint8(0x0F);
1549 emitUint8(0xC6); 1599 emitUint8(0xC6);
1550 emitXmmRegisterOperand(dst, src); 1600 emitXmmRegisterOperand(dst, src);
1551 assert(imm.is_uint8()); 1601 assert(imm.is_uint8());
1552 emitUint8(imm.value()); 1602 emitUint8(imm.value());
1553 } 1603 }
1554 1604
1555 template <class Machine> 1605 template <class Machine>
1556 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1606 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1557 typename Traits::XmmRegister dst, 1607 typename Traits::XmmRegister dst,
1558 const typename Traits::Address &src, 1608 const typename Traits::Address &src,
1559 const Immediate &imm) { 1609 const Immediate &imm) {
1560 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1610 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1611 emitAddrSizeOverridePrefix();
1561 emitRex(RexTypeIrrelevant, src, dst); 1612 emitRex(RexTypeIrrelevant, src, dst);
1562 emitUint8(0x0F); 1613 emitUint8(0x0F);
1563 emitUint8(0xC6); 1614 emitUint8(0xC6);
1564 emitOperand(gprEncoding(dst), src); 1615 emitOperand(gprEncoding(dst), src);
1565 assert(imm.is_uint8()); 1616 assert(imm.is_uint8());
1566 emitUint8(imm.value()); 1617 emitUint8(imm.value());
1567 } 1618 }
1568 1619
1569 template <class Machine> 1620 template <class Machine>
1570 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) { 1621 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) {
(...skipping 14 matching lines...) Expand all
1585 emitUint8(0x0F); 1636 emitUint8(0x0F);
1586 emitUint8(0x5B); 1637 emitUint8(0x5B);
1587 emitXmmRegisterOperand(dst, src); 1638 emitXmmRegisterOperand(dst, src);
1588 } 1639 }
1589 1640
1590 template <class Machine> 1641 template <class Machine>
1591 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, 1642 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
1592 typename Traits::XmmRegister dst, 1643 typename Traits::XmmRegister dst,
1593 const typename Traits::Address &src) { 1644 const typename Traits::Address &src) {
1594 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1645 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1646 emitAddrSizeOverridePrefix();
1595 emitRex(RexTypeIrrelevant, src, dst); 1647 emitRex(RexTypeIrrelevant, src, dst);
1596 emitUint8(0x0F); 1648 emitUint8(0x0F);
1597 emitUint8(0x5B); 1649 emitUint8(0x5B);
1598 emitOperand(gprEncoding(dst), src); 1650 emitOperand(gprEncoding(dst), src);
1599 } 1651 }
1600 1652
1601 template <class Machine> 1653 template <class Machine>
1602 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1654 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1603 typename Traits::XmmRegister dst, 1655 typename Traits::XmmRegister dst,
1604 typename Traits::XmmRegister src) { 1656 typename Traits::XmmRegister src) {
1605 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1657 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1606 emitUint8(0xF3); 1658 emitUint8(0xF3);
1607 emitRexRB(RexTypeIrrelevant, dst, src); 1659 emitRexRB(RexTypeIrrelevant, dst, src);
1608 emitUint8(0x0F); 1660 emitUint8(0x0F);
1609 emitUint8(0x5B); 1661 emitUint8(0x5B);
1610 emitXmmRegisterOperand(dst, src); 1662 emitXmmRegisterOperand(dst, src);
1611 } 1663 }
1612 1664
1613 template <class Machine> 1665 template <class Machine>
1614 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1666 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1615 typename Traits::XmmRegister dst, 1667 typename Traits::XmmRegister dst,
1616 const typename Traits::Address &src) { 1668 const typename Traits::Address &src) {
1617 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1669 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1618 emitUint8(0xF3); 1670 emitUint8(0xF3);
1671 emitAddrSizeOverridePrefix();
1619 emitRex(RexTypeIrrelevant, src, dst); 1672 emitRex(RexTypeIrrelevant, src, dst);
1620 emitUint8(0x0F); 1673 emitUint8(0x0F);
1621 emitUint8(0x5B); 1674 emitUint8(0x5B);
1622 emitOperand(gprEncoding(dst), src); 1675 emitOperand(gprEncoding(dst), src);
1623 } 1676 }
1624 1677
1625 template <class Machine> 1678 template <class Machine>
1626 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1679 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1627 typename Traits::XmmRegister dst, 1680 typename Traits::XmmRegister dst,
1628 Type SrcTy, 1681 Type SrcTy,
1629 typename Traits::GPRRegister src) { 1682 typename Traits::GPRRegister src) {
1630 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1683 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1631 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1684 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1632 emitRexRB(SrcTy, dst, src); 1685 emitRexRB(SrcTy, dst, src);
1633 emitUint8(0x0F); 1686 emitUint8(0x0F);
1634 emitUint8(0x2A); 1687 emitUint8(0x2A);
1635 emitXmmRegisterOperand(dst, src); 1688 emitXmmRegisterOperand(dst, src);
1636 } 1689 }
1637 1690
1638 template <class Machine> 1691 template <class Machine>
1639 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1692 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1640 typename Traits::XmmRegister dst, 1693 typename Traits::XmmRegister dst,
1641 Type SrcTy, 1694 Type SrcTy,
1642 const typename Traits::Address &src) { 1695 const typename Traits::Address &src) {
1643 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1696 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1644 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1697 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1698 emitAddrSizeOverridePrefix();
1645 emitRex(SrcTy, src, dst); 1699 emitRex(SrcTy, src, dst);
1646 emitUint8(0x0F); 1700 emitUint8(0x0F);
1647 emitUint8(0x2A); 1701 emitUint8(0x2A);
1648 emitOperand(gprEncoding(dst), src); 1702 emitOperand(gprEncoding(dst), src);
1649 } 1703 }
1650 1704
1651 template <class Machine> 1705 template <class Machine>
1652 void AssemblerX86Base<Machine>::cvtfloat2float( 1706 void AssemblerX86Base<Machine>::cvtfloat2float(
1653 Type SrcTy, typename Traits::XmmRegister dst, 1707 Type SrcTy, typename Traits::XmmRegister dst,
1654 typename Traits::XmmRegister src) { 1708 typename Traits::XmmRegister src) {
1655 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1709 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1656 // ss2sd or sd2ss 1710 // ss2sd or sd2ss
1657 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1711 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1658 emitRexRB(RexTypeIrrelevant, dst, src); 1712 emitRexRB(RexTypeIrrelevant, dst, src);
1659 emitUint8(0x0F); 1713 emitUint8(0x0F);
1660 emitUint8(0x5A); 1714 emitUint8(0x5A);
1661 emitXmmRegisterOperand(dst, src); 1715 emitXmmRegisterOperand(dst, src);
1662 } 1716 }
1663 1717
1664 template <class Machine> 1718 template <class Machine>
1665 void AssemblerX86Base<Machine>::cvtfloat2float( 1719 void AssemblerX86Base<Machine>::cvtfloat2float(
1666 Type SrcTy, typename Traits::XmmRegister dst, 1720 Type SrcTy, typename Traits::XmmRegister dst,
1667 const typename Traits::Address &src) { 1721 const typename Traits::Address &src) {
1668 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1722 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1669 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1723 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1724 emitAddrSizeOverridePrefix();
1670 emitRex(RexTypeIrrelevant, src, dst); 1725 emitRex(RexTypeIrrelevant, src, dst);
1671 emitUint8(0x0F); 1726 emitUint8(0x0F);
1672 emitUint8(0x5A); 1727 emitUint8(0x5A);
1673 emitOperand(gprEncoding(dst), src); 1728 emitOperand(gprEncoding(dst), src);
1674 } 1729 }
1675 1730
1676 template <class Machine> 1731 template <class Machine>
1677 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, 1732 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy,
1678 typename Traits::GPRRegister dst, 1733 typename Traits::GPRRegister dst,
1679 Type SrcTy, 1734 Type SrcTy,
1680 typename Traits::XmmRegister src) { 1735 typename Traits::XmmRegister src) {
1681 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1736 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1682 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1737 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1683 emitRexRB(DestTy, dst, src); 1738 emitRexRB(DestTy, dst, src);
1684 emitUint8(0x0F); 1739 emitUint8(0x0F);
1685 emitUint8(0x2C); 1740 emitUint8(0x2C);
1686 emitXmmRegisterOperand(dst, src); 1741 emitXmmRegisterOperand(dst, src);
1687 } 1742 }
1688 1743
1689 template <class Machine> 1744 template <class Machine>
1690 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy, 1745 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy,
1691 typename Traits::GPRRegister dst, 1746 typename Traits::GPRRegister dst,
1692 Type SrcTy, 1747 Type SrcTy,
1693 const typename Traits::Address &src) { 1748 const typename Traits::Address &src) {
1694 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1749 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1695 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1750 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1751 emitAddrSizeOverridePrefix();
1696 emitRex(DestTy, src, dst); 1752 emitRex(DestTy, src, dst);
1697 emitUint8(0x0F); 1753 emitUint8(0x0F);
1698 emitUint8(0x2C); 1754 emitUint8(0x2C);
1699 emitOperand(gprEncoding(dst), src); 1755 emitOperand(gprEncoding(dst), src);
1700 } 1756 }
1701 1757
1702 template <class Machine> 1758 template <class Machine>
1703 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1759 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1704 typename Traits::XmmRegister b) { 1760 typename Traits::XmmRegister b) {
1705 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1761 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1706 if (Ty == IceType_f64) 1762 if (Ty == IceType_f64)
1707 emitUint8(0x66); 1763 emitUint8(0x66);
1708 emitRexRB(RexTypeIrrelevant, a, b); 1764 emitRexRB(RexTypeIrrelevant, a, b);
1709 emitUint8(0x0F); 1765 emitUint8(0x0F);
1710 emitUint8(0x2E); 1766 emitUint8(0x2E);
1711 emitXmmRegisterOperand(a, b); 1767 emitXmmRegisterOperand(a, b);
1712 } 1768 }
1713 1769
1714 template <class Machine> 1770 template <class Machine>
1715 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1771 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1716 const typename Traits::Address &b) { 1772 const typename Traits::Address &b) {
1717 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1773 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1718 if (Ty == IceType_f64) 1774 if (Ty == IceType_f64)
1719 emitUint8(0x66); 1775 emitUint8(0x66);
1776 emitAddrSizeOverridePrefix();
1720 emitRex(RexTypeIrrelevant, b, a); 1777 emitRex(RexTypeIrrelevant, b, a);
1721 emitUint8(0x0F); 1778 emitUint8(0x0F);
1722 emitUint8(0x2E); 1779 emitUint8(0x2E);
1723 emitOperand(gprEncoding(a), b); 1780 emitOperand(gprEncoding(a), b);
1724 } 1781 }
1725 1782
1726 template <class Machine> 1783 template <class Machine>
1727 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst, 1784 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst,
1728 typename Traits::XmmRegister src) { 1785 typename Traits::XmmRegister src) {
1729 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 13 matching lines...) Expand all
1743 emitUint8(0x50); 1800 emitUint8(0x50);
1744 emitXmmRegisterOperand(dst, src); 1801 emitXmmRegisterOperand(dst, src);
1745 } 1802 }
1746 1803
1747 template <class Machine> 1804 template <class Machine>
1748 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1805 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1749 typename Traits::XmmRegister dst, 1806 typename Traits::XmmRegister dst,
1750 const typename Traits::Address &src) { 1807 const typename Traits::Address &src) {
1751 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1808 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1752 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1809 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1810 emitAddrSizeOverridePrefix();
1753 emitRex(RexTypeIrrelevant, src, dst); 1811 emitRex(RexTypeIrrelevant, src, dst);
1754 emitUint8(0x0F); 1812 emitUint8(0x0F);
1755 emitUint8(0x51); 1813 emitUint8(0x51);
1756 emitOperand(gprEncoding(dst), src); 1814 emitOperand(gprEncoding(dst), src);
1757 } 1815 }
1758 1816
1759 template <class Machine> 1817 template <class Machine>
1760 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1818 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1761 typename Traits::XmmRegister dst, 1819 typename Traits::XmmRegister dst,
1762 typename Traits::XmmRegister src) { 1820 typename Traits::XmmRegister src) {
1763 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1821 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1764 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1822 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1765 emitRexRB(RexTypeIrrelevant, dst, src); 1823 emitRexRB(RexTypeIrrelevant, dst, src);
1766 emitUint8(0x0F); 1824 emitUint8(0x0F);
1767 emitUint8(0x51); 1825 emitUint8(0x51);
1768 emitXmmRegisterOperand(dst, src); 1826 emitXmmRegisterOperand(dst, src);
1769 } 1827 }
1770 1828
1771 template <class Machine> 1829 template <class Machine>
1772 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, 1830 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst,
1773 const typename Traits::Address &src) { 1831 const typename Traits::Address &src) {
1774 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1832 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1775 if (!isFloat32Asserting32Or64(Ty)) 1833 if (!isFloat32Asserting32Or64(Ty))
1776 emitUint8(0x66); 1834 emitUint8(0x66);
1835 emitAddrSizeOverridePrefix();
1777 emitRex(RexTypeIrrelevant, src, dst); 1836 emitRex(RexTypeIrrelevant, src, dst);
1778 emitUint8(0x0F); 1837 emitUint8(0x0F);
1779 emitUint8(0x57); 1838 emitUint8(0x57);
1780 emitOperand(gprEncoding(dst), src); 1839 emitOperand(gprEncoding(dst), src);
1781 } 1840 }
1782 1841
1783 template <class Machine> 1842 template <class Machine>
1784 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst, 1843 void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst,
1785 typename Traits::XmmRegister src) { 1844 typename Traits::XmmRegister src) {
1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1845 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 26 matching lines...) Expand all
1813 template <class Machine> 1872 template <class Machine>
1814 void AssemblerX86Base<Machine>::insertps(Type Ty, 1873 void AssemblerX86Base<Machine>::insertps(Type Ty,
1815 typename Traits::XmmRegister dst, 1874 typename Traits::XmmRegister dst,
1816 const typename Traits::Address &src, 1875 const typename Traits::Address &src,
1817 const Immediate &imm) { 1876 const Immediate &imm) {
1818 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1877 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1819 assert(imm.is_uint8()); 1878 assert(imm.is_uint8());
1820 assert(isVectorFloatingType(Ty)); 1879 assert(isVectorFloatingType(Ty));
1821 (void)Ty; 1880 (void)Ty;
1822 emitUint8(0x66); 1881 emitUint8(0x66);
1882 emitAddrSizeOverridePrefix();
1823 emitRex(RexTypeIrrelevant, src, dst); 1883 emitRex(RexTypeIrrelevant, src, dst);
1824 emitUint8(0x0F); 1884 emitUint8(0x0F);
1825 emitUint8(0x3A); 1885 emitUint8(0x3A);
1826 emitUint8(0x21); 1886 emitUint8(0x21);
1827 emitOperand(gprEncoding(dst), src); 1887 emitOperand(gprEncoding(dst), src);
1828 emitUint8(imm.value()); 1888 emitUint8(imm.value());
1829 } 1889 }
1830 1890
1831 template <class Machine> 1891 template <class Machine>
1832 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1892 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
(...skipping 14 matching lines...) Expand all
1847 emitUint8(imm.value()); 1907 emitUint8(imm.value());
1848 } 1908 }
1849 1909
1850 template <class Machine> 1910 template <class Machine>
1851 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1911 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
1852 const typename Traits::Address &src, 1912 const typename Traits::Address &src,
1853 const Immediate &imm) { 1913 const Immediate &imm) {
1854 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1914 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1855 assert(imm.is_uint8()); 1915 assert(imm.is_uint8());
1856 emitUint8(0x66); 1916 emitUint8(0x66);
1917 emitAddrSizeOverridePrefix();
1857 emitRex(RexTypeIrrelevant, src, dst); 1918 emitRex(RexTypeIrrelevant, src, dst);
1858 emitUint8(0x0F); 1919 emitUint8(0x0F);
1859 if (Ty == IceType_i16) { 1920 if (Ty == IceType_i16) {
1860 emitUint8(0xC4); 1921 emitUint8(0xC4);
1861 } else { 1922 } else {
1862 emitUint8(0x3A); 1923 emitUint8(0x3A);
1863 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1924 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1864 } 1925 }
1865 emitOperand(gprEncoding(dst), src); 1926 emitOperand(gprEncoding(dst), src);
1866 emitUint8(imm.value()); 1927 emitUint8(imm.value());
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 } 1982 }
1922 emitXmmRegisterOperand(dst, src); 1983 emitXmmRegisterOperand(dst, src);
1923 } 1984 }
1924 1985
1925 template <class Machine> 1986 template <class Machine>
1926 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, 1987 void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
1927 typename Traits::XmmRegister dst, 1988 typename Traits::XmmRegister dst,
1928 const typename Traits::Address &src) { 1989 const typename Traits::Address &src) {
1929 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1990 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1930 emitUint8(0x66); 1991 emitUint8(0x66);
1992 emitAddrSizeOverridePrefix();
1931 emitRex(RexTypeIrrelevant, src, dst); 1993 emitRex(RexTypeIrrelevant, src, dst);
1932 emitUint8(0x0F); 1994 emitUint8(0x0F);
1933 if (isByteSizedArithType(Ty)) { 1995 if (isByteSizedArithType(Ty)) {
1934 emitUint8(0x74); 1996 emitUint8(0x74);
1935 } else if (Ty == IceType_i16) { 1997 } else if (Ty == IceType_i16) {
1936 emitUint8(0x75); 1998 emitUint8(0x75);
1937 } else { 1999 } else {
1938 emitUint8(0x76); 2000 emitUint8(0x76);
1939 } 2001 }
1940 emitOperand(gprEncoding(dst), src); 2002 emitOperand(gprEncoding(dst), src);
(...skipping 16 matching lines...) Expand all
1957 } 2019 }
1958 emitXmmRegisterOperand(dst, src); 2020 emitXmmRegisterOperand(dst, src);
1959 } 2021 }
1960 2022
1961 template <class Machine> 2023 template <class Machine>
1962 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, 2024 void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
1963 typename Traits::XmmRegister dst, 2025 typename Traits::XmmRegister dst,
1964 const typename Traits::Address &src) { 2026 const typename Traits::Address &src) {
1965 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2027 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1966 emitUint8(0x66); 2028 emitUint8(0x66);
2029 emitAddrSizeOverridePrefix();
1967 emitRex(RexTypeIrrelevant, src, dst); 2030 emitRex(RexTypeIrrelevant, src, dst);
1968 emitUint8(0x0F); 2031 emitUint8(0x0F);
1969 if (isByteSizedArithType(Ty)) { 2032 if (isByteSizedArithType(Ty)) {
1970 emitUint8(0x64); 2033 emitUint8(0x64);
1971 } else if (Ty == IceType_i16) { 2034 } else if (Ty == IceType_i16) {
1972 emitUint8(0x65); 2035 emitUint8(0x65);
1973 } else { 2036 } else {
1974 emitUint8(0x66); 2037 emitUint8(0x66);
1975 } 2038 }
1976 emitOperand(gprEncoding(dst), src); 2039 emitOperand(gprEncoding(dst), src);
(...skipping 11 matching lines...) Expand all
1988 emitUint8(0x0B); 2051 emitUint8(0x0B);
1989 emitXmmRegisterOperand(dst, src); 2052 emitXmmRegisterOperand(dst, src);
1990 // Mask precision exeption. 2053 // Mask precision exeption.
1991 emitUint8(static_cast<uint8_t>(mode) | 0x8); 2054 emitUint8(static_cast<uint8_t>(mode) | 0x8);
1992 } 2055 }
1993 2056
1994 template <class Machine> 2057 template <class Machine>
1995 template <typename T, typename> 2058 template <typename T, typename>
1996 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) { 2059 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) {
1997 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2060 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2061 emitAddrSizeOverridePrefix();
1998 emitUint8(0xD9); 2062 emitUint8(0xD9);
1999 emitOperand(7, dst); 2063 emitOperand(7, dst);
2000 } 2064 }
2001 2065
2002 template <class Machine> 2066 template <class Machine>
2003 template <typename T, typename> 2067 template <typename T, typename>
2004 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) { 2068 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) {
2005 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2069 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2070 emitAddrSizeOverridePrefix();
2006 emitUint8(0xD9); 2071 emitUint8(0xD9);
2007 emitOperand(5, src); 2072 emitOperand(5, src);
2008 } 2073 }
2009 2074
2010 template <class Machine> 2075 template <class Machine>
2011 template <typename T, typename> 2076 template <typename T, typename>
2012 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) { 2077 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) {
2013 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2078 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2079 emitAddrSizeOverridePrefix();
2014 emitUint8(0xDF); 2080 emitUint8(0xDF);
2015 emitOperand(7, dst); 2081 emitOperand(7, dst);
2016 } 2082 }
2017 2083
2018 template <class Machine> 2084 template <class Machine>
2019 template <typename T, typename> 2085 template <typename T, typename>
2020 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) { 2086 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) {
2021 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2087 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2088 emitAddrSizeOverridePrefix();
2022 emitUint8(0xDB); 2089 emitUint8(0xDB);
2023 emitOperand(3, dst); 2090 emitOperand(3, dst);
2024 } 2091 }
2025 2092
2026 template <class Machine> 2093 template <class Machine>
2027 template <typename T, typename> 2094 template <typename T, typename>
2028 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) { 2095 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) {
2029 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2096 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2097 emitAddrSizeOverridePrefix();
2030 emitUint8(0xDF); 2098 emitUint8(0xDF);
2031 emitOperand(5, src); 2099 emitOperand(5, src);
2032 } 2100 }
2033 2101
2034 template <class Machine> 2102 template <class Machine>
2035 template <typename T, typename> 2103 template <typename T, typename>
2036 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) { 2104 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) {
2037 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2105 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2106 emitAddrSizeOverridePrefix();
2038 emitUint8(0xDB); 2107 emitUint8(0xDB);
2039 emitOperand(0, src); 2108 emitOperand(0, src);
2040 } 2109 }
2041 2110
2042 template <class Machine> 2111 template <class Machine>
2043 template <typename, typename> 2112 template <typename, typename>
2044 void AssemblerX86Base<Machine>::fincstp() { 2113 void AssemblerX86Base<Machine>::fincstp() {
2045 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2114 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2046 emitUint8(0xD9); 2115 emitUint8(0xD9);
2047 emitUint8(0xF7); 2116 emitUint8(0xF7);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2083 2152
2084 template <class Machine> 2153 template <class Machine>
2085 template <uint32_t Tag> 2154 template <uint32_t Tag>
2086 void AssemblerX86Base<Machine>::arith_int( 2155 void AssemblerX86Base<Machine>::arith_int(
2087 Type Ty, typename Traits::GPRRegister reg, 2156 Type Ty, typename Traits::GPRRegister reg,
2088 const typename Traits::Address &address) { 2157 const typename Traits::Address &address) {
2089 static_assert(Tag < 8, "Tag must be between 0..7"); 2158 static_assert(Tag < 8, "Tag must be between 0..7");
2090 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2159 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2091 if (Ty == IceType_i16) 2160 if (Ty == IceType_i16)
2092 emitOperandSizeOverride(); 2161 emitOperandSizeOverride();
2162 emitAddrSizeOverridePrefix();
2093 emitRex(Ty, address, reg); 2163 emitRex(Ty, address, reg);
2094 if (isByteSizedType(Ty)) 2164 if (isByteSizedType(Ty))
2095 emitUint8(Tag * 8 + 2); 2165 emitUint8(Tag * 8 + 2);
2096 else 2166 else
2097 emitUint8(Tag * 8 + 3); 2167 emitUint8(Tag * 8 + 3);
2098 emitOperand(gprEncoding(reg), address); 2168 emitOperand(gprEncoding(reg), address);
2099 } 2169 }
2100 2170
2101 template <class Machine> 2171 template <class Machine>
2102 template <uint32_t Tag> 2172 template <uint32_t Tag>
2103 void AssemblerX86Base<Machine>::arith_int( 2173 void AssemblerX86Base<Machine>::arith_int(
2104 Type Ty, const typename Traits::Address &address, 2174 Type Ty, const typename Traits::Address &address,
2105 typename Traits::GPRRegister reg) { 2175 typename Traits::GPRRegister reg) {
2106 static_assert(Tag < 8, "Tag must be between 0..7"); 2176 static_assert(Tag < 8, "Tag must be between 0..7");
2107 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2177 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2108 if (Ty == IceType_i16) 2178 if (Ty == IceType_i16)
2109 emitOperandSizeOverride(); 2179 emitOperandSizeOverride();
2180 emitAddrSizeOverridePrefix();
2110 emitRex(Ty, address, reg); 2181 emitRex(Ty, address, reg);
2111 if (isByteSizedType(Ty)) 2182 if (isByteSizedType(Ty))
2112 emitUint8(Tag * 8 + 0); 2183 emitUint8(Tag * 8 + 0);
2113 else 2184 else
2114 emitUint8(Tag * 8 + 1); 2185 emitUint8(Tag * 8 + 1);
2115 emitOperand(gprEncoding(reg), address); 2186 emitOperand(gprEncoding(reg), address);
2116 } 2187 }
2117 2188
2118 template <class Machine> 2189 template <class Machine>
2119 template <uint32_t Tag> 2190 template <uint32_t Tag>
2120 void AssemblerX86Base<Machine>::arith_int( 2191 void AssemblerX86Base<Machine>::arith_int(
2121 Type Ty, const typename Traits::Address &address, const Immediate &imm) { 2192 Type Ty, const typename Traits::Address &address, const Immediate &imm) {
2122 static_assert(Tag < 8, "Tag must be between 0..7"); 2193 static_assert(Tag < 8, "Tag must be between 0..7");
2123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2194 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2124 if (Ty == IceType_i16) 2195 if (Ty == IceType_i16)
2125 emitOperandSizeOverride(); 2196 emitOperandSizeOverride();
2197 emitAddrSizeOverridePrefix();
2126 emitRex(Ty, address, RexRegIrrelevant); 2198 emitRex(Ty, address, RexRegIrrelevant);
2127 if (isByteSizedType(Ty)) { 2199 if (isByteSizedType(Ty)) {
2128 emitComplexI8(Tag, address, imm); 2200 emitComplexI8(Tag, address, imm);
2129 } else { 2201 } else {
2130 emitComplex(Ty, Tag, address, imm); 2202 emitComplex(Ty, Tag, address, imm);
2131 } 2203 }
2132 } 2204 }
2133 2205
2134 template <class Machine> 2206 template <class Machine>
2135 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg, 2207 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2)); 2249 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2));
2178 } 2250 }
2179 2251
2180 template <class Machine> 2252 template <class Machine>
2181 void AssemblerX86Base<Machine>::test(Type Ty, 2253 void AssemblerX86Base<Machine>::test(Type Ty,
2182 const typename Traits::Address &addr, 2254 const typename Traits::Address &addr,
2183 typename Traits::GPRRegister reg) { 2255 typename Traits::GPRRegister reg) {
2184 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2256 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2185 if (Ty == IceType_i16) 2257 if (Ty == IceType_i16)
2186 emitOperandSizeOverride(); 2258 emitOperandSizeOverride();
2259 emitAddrSizeOverridePrefix();
2187 emitRex(Ty, addr, reg); 2260 emitRex(Ty, addr, reg);
2188 if (isByteSizedType(Ty)) 2261 if (isByteSizedType(Ty))
2189 emitUint8(0x84); 2262 emitUint8(0x84);
2190 else 2263 else
2191 emitUint8(0x85); 2264 emitUint8(0x85);
2192 emitOperand(gprEncoding(reg), addr); 2265 emitOperand(gprEncoding(reg), addr);
2193 } 2266 }
2194 2267
2195 template <class Machine> 2268 template <class Machine>
2196 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg, 2269 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 2302
2230 template <class Machine> 2303 template <class Machine>
2231 void AssemblerX86Base<Machine>::test(Type Ty, 2304 void AssemblerX86Base<Machine>::test(Type Ty,
2232 const typename Traits::Address &addr, 2305 const typename Traits::Address &addr,
2233 const Immediate &immediate) { 2306 const Immediate &immediate) {
2234 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2307 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2235 // If the immediate is short, we only test the byte addr to keep the encoding 2308 // If the immediate is short, we only test the byte addr to keep the encoding
2236 // short. 2309 // short.
2237 if (immediate.is_uint8()) { 2310 if (immediate.is_uint8()) {
2238 // Use zero-extended 8-bit immediate. 2311 // Use zero-extended 8-bit immediate.
2312 emitAddrSizeOverridePrefix();
2239 emitRex(Ty, addr, RexRegIrrelevant); 2313 emitRex(Ty, addr, RexRegIrrelevant);
2240 emitUint8(0xF6); 2314 emitUint8(0xF6);
2241 emitOperand(0, addr); 2315 emitOperand(0, addr);
2242 emitUint8(immediate.value() & 0xFF); 2316 emitUint8(immediate.value() & 0xFF);
2243 } else { 2317 } else {
2244 if (Ty == IceType_i16) 2318 if (Ty == IceType_i16)
2245 emitOperandSizeOverride(); 2319 emitOperandSizeOverride();
2320 emitAddrSizeOverridePrefix();
2246 emitRex(Ty, addr, RexRegIrrelevant); 2321 emitRex(Ty, addr, RexRegIrrelevant);
2247 emitUint8(0xF7); 2322 emitUint8(0xF7);
2248 emitOperand(0, addr); 2323 emitOperand(0, addr);
2249 emitImmediate(Ty, immediate); 2324 emitImmediate(Ty, immediate);
2250 } 2325 }
2251 } 2326 }
2252 2327
2253 template <class Machine> 2328 template <class Machine>
2254 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst, 2329 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst,
2255 typename Traits::GPRRegister src) { 2330 typename Traits::GPRRegister src) {
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
2512 emitUint8(0xF7); 2587 emitUint8(0xF7);
2513 emitRegisterOperand(6, gprEncoding(reg)); 2588 emitRegisterOperand(6, gprEncoding(reg));
2514 } 2589 }
2515 2590
2516 template <class Machine> 2591 template <class Machine>
2517 void AssemblerX86Base<Machine>::div(Type Ty, 2592 void AssemblerX86Base<Machine>::div(Type Ty,
2518 const typename Traits::Address &addr) { 2593 const typename Traits::Address &addr) {
2519 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2594 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2520 if (Ty == IceType_i16) 2595 if (Ty == IceType_i16)
2521 emitOperandSizeOverride(); 2596 emitOperandSizeOverride();
2597 emitAddrSizeOverridePrefix();
2522 emitRex(Ty, addr, RexRegIrrelevant); 2598 emitRex(Ty, addr, RexRegIrrelevant);
2523 if (isByteSizedArithType(Ty)) 2599 if (isByteSizedArithType(Ty))
2524 emitUint8(0xF6); 2600 emitUint8(0xF6);
2525 else 2601 else
2526 emitUint8(0xF7); 2602 emitUint8(0xF7);
2527 emitOperand(6, addr); 2603 emitOperand(6, addr);
2528 } 2604 }
2529 2605
2530 template <class Machine> 2606 template <class Machine>
2531 void AssemblerX86Base<Machine>::idiv(Type Ty, 2607 void AssemblerX86Base<Machine>::idiv(Type Ty,
2532 typename Traits::GPRRegister reg) { 2608 typename Traits::GPRRegister reg) {
2533 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2609 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2534 if (Ty == IceType_i16) 2610 if (Ty == IceType_i16)
2535 emitOperandSizeOverride(); 2611 emitOperandSizeOverride();
2536 emitRexB(Ty, reg); 2612 emitRexB(Ty, reg);
2537 if (isByteSizedArithType(Ty)) 2613 if (isByteSizedArithType(Ty))
2538 emitUint8(0xF6); 2614 emitUint8(0xF6);
2539 else 2615 else
2540 emitUint8(0xF7); 2616 emitUint8(0xF7);
2541 emitRegisterOperand(7, gprEncoding(reg)); 2617 emitRegisterOperand(7, gprEncoding(reg));
2542 } 2618 }
2543 2619
2544 template <class Machine> 2620 template <class Machine>
2545 void AssemblerX86Base<Machine>::idiv(Type Ty, 2621 void AssemblerX86Base<Machine>::idiv(Type Ty,
2546 const typename Traits::Address &addr) { 2622 const typename Traits::Address &addr) {
2547 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2623 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2548 if (Ty == IceType_i16) 2624 if (Ty == IceType_i16)
2549 emitOperandSizeOverride(); 2625 emitOperandSizeOverride();
2626 emitAddrSizeOverridePrefix();
2550 emitRex(Ty, addr, RexRegIrrelevant); 2627 emitRex(Ty, addr, RexRegIrrelevant);
2551 if (isByteSizedArithType(Ty)) 2628 if (isByteSizedArithType(Ty))
2552 emitUint8(0xF6); 2629 emitUint8(0xF6);
2553 else 2630 else
2554 emitUint8(0xF7); 2631 emitUint8(0xF7);
2555 emitOperand(7, addr); 2632 emitOperand(7, addr);
2556 } 2633 }
2557 2634
2558 template <class Machine> 2635 template <class Machine>
2559 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2636 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
(...skipping 10 matching lines...) Expand all
2570 } 2647 }
2571 2648
2572 template <class Machine> 2649 template <class Machine>
2573 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2650 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2574 const typename Traits::Address &address) { 2651 const typename Traits::Address &address) {
2575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2652 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2576 assert(Ty == IceType_i16 || Ty == IceType_i32 || 2653 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
2577 (Traits::Is64Bit && Ty == IceType_i64)); 2654 (Traits::Is64Bit && Ty == IceType_i64));
2578 if (Ty == IceType_i16) 2655 if (Ty == IceType_i16)
2579 emitOperandSizeOverride(); 2656 emitOperandSizeOverride();
2657 emitAddrSizeOverridePrefix();
2580 emitRex(Ty, address, reg); 2658 emitRex(Ty, address, reg);
2581 emitUint8(0x0F); 2659 emitUint8(0x0F);
2582 emitUint8(0xAF); 2660 emitUint8(0xAF);
2583 emitOperand(gprEncoding(reg), address); 2661 emitOperand(gprEncoding(reg), address);
2584 } 2662 }
2585 2663
2586 template <class Machine> 2664 template <class Machine>
2587 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2665 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2588 const Immediate &imm) { 2666 const Immediate &imm) {
2589 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2667 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 25 matching lines...) Expand all
2615 emitUint8(0xF7); 2693 emitUint8(0xF7);
2616 emitRegisterOperand(5, gprEncoding(reg)); 2694 emitRegisterOperand(5, gprEncoding(reg));
2617 } 2695 }
2618 2696
2619 template <class Machine> 2697 template <class Machine>
2620 void AssemblerX86Base<Machine>::imul(Type Ty, 2698 void AssemblerX86Base<Machine>::imul(Type Ty,
2621 const typename Traits::Address &address) { 2699 const typename Traits::Address &address) {
2622 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2700 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2623 if (Ty == IceType_i16) 2701 if (Ty == IceType_i16)
2624 emitOperandSizeOverride(); 2702 emitOperandSizeOverride();
2703 emitAddrSizeOverridePrefix();
2625 emitRex(Ty, address, RexRegIrrelevant); 2704 emitRex(Ty, address, RexRegIrrelevant);
2626 if (isByteSizedArithType(Ty)) 2705 if (isByteSizedArithType(Ty))
2627 emitUint8(0xF6); 2706 emitUint8(0xF6);
2628 else 2707 else
2629 emitUint8(0xF7); 2708 emitUint8(0xF7);
2630 emitOperand(5, address); 2709 emitOperand(5, address);
2631 } 2710 }
2632 2711
2633 template <class Machine> 2712 template <class Machine>
2634 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2713 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
(...skipping 16 matching lines...) Expand all
2651 } 2730 }
2652 2731
2653 template <class Machine> 2732 template <class Machine>
2654 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2733 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
2655 const typename Traits::Address &address, 2734 const typename Traits::Address &address,
2656 const Immediate &imm) { 2735 const Immediate &imm) {
2657 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2736 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2658 assert(Ty == IceType_i16 || Ty == IceType_i32); 2737 assert(Ty == IceType_i16 || Ty == IceType_i32);
2659 if (Ty == IceType_i16) 2738 if (Ty == IceType_i16)
2660 emitOperandSizeOverride(); 2739 emitOperandSizeOverride();
2740 emitAddrSizeOverridePrefix();
2661 emitRex(Ty, address, dst); 2741 emitRex(Ty, address, dst);
2662 if (imm.is_int8()) { 2742 if (imm.is_int8()) {
2663 emitUint8(0x6B); 2743 emitUint8(0x6B);
2664 emitOperand(gprEncoding(dst), address); 2744 emitOperand(gprEncoding(dst), address);
2665 emitUint8(imm.value() & 0xFF); 2745 emitUint8(imm.value() & 0xFF);
2666 } else { 2746 } else {
2667 emitUint8(0x69); 2747 emitUint8(0x69);
2668 emitOperand(gprEncoding(dst), address); 2748 emitOperand(gprEncoding(dst), address);
2669 emitImmediate(Ty, imm); 2749 emitImmediate(Ty, imm);
2670 } 2750 }
(...skipping 11 matching lines...) Expand all
2682 emitUint8(0xF7); 2762 emitUint8(0xF7);
2683 emitRegisterOperand(4, gprEncoding(reg)); 2763 emitRegisterOperand(4, gprEncoding(reg));
2684 } 2764 }
2685 2765
2686 template <class Machine> 2766 template <class Machine>
2687 void AssemblerX86Base<Machine>::mul(Type Ty, 2767 void AssemblerX86Base<Machine>::mul(Type Ty,
2688 const typename Traits::Address &address) { 2768 const typename Traits::Address &address) {
2689 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2769 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2690 if (Ty == IceType_i16) 2770 if (Ty == IceType_i16)
2691 emitOperandSizeOverride(); 2771 emitOperandSizeOverride();
2772 emitAddrSizeOverridePrefix();
2692 emitRex(Ty, address, RexRegIrrelevant); 2773 emitRex(Ty, address, RexRegIrrelevant);
2693 if (isByteSizedArithType(Ty)) 2774 if (isByteSizedArithType(Ty))
2694 emitUint8(0xF6); 2775 emitUint8(0xF6);
2695 else 2776 else
2696 emitUint8(0xF7); 2777 emitUint8(0xF7);
2697 emitOperand(4, address); 2778 emitOperand(4, address);
2698 } 2779 }
2699 2780
2700 template <class Machine> 2781 template <class Machine>
2701 template <typename, typename> 2782 template <typename, typename>
2702 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) { 2783 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) {
2703 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2784 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2704 emitUint8(0x40 + reg); 2785 emitUint8(0x40 + reg);
2705 } 2786 }
2706 2787
2707 template <class Machine> 2788 template <class Machine>
2708 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) { 2789 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) {
2709 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2790 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2791 emitAddrSizeOverridePrefix();
2710 emitRex(IceType_i32, address, RexRegIrrelevant); 2792 emitRex(IceType_i32, address, RexRegIrrelevant);
2711 emitUint8(0xFF); 2793 emitUint8(0xFF);
2712 emitOperand(0, address); 2794 emitOperand(0, address);
2713 } 2795 }
2714 2796
2715 template <class Machine> 2797 template <class Machine>
2716 template <typename, typename> 2798 template <typename, typename>
2717 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) { 2799 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) {
2718 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2800 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2719 emitUint8(0x48 + reg); 2801 emitUint8(0x48 + reg);
2720 } 2802 }
2721 2803
2722 template <class Machine> 2804 template <class Machine>
2723 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) { 2805 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) {
2724 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2806 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2807 emitAddrSizeOverridePrefix();
2725 emitRex(IceType_i32, address, RexRegIrrelevant); 2808 emitRex(IceType_i32, address, RexRegIrrelevant);
2726 emitUint8(0xFF); 2809 emitUint8(0xFF);
2727 emitOperand(1, address); 2810 emitOperand(1, address);
2728 } 2811 }
2729 2812
2730 template <class Machine> 2813 template <class Machine>
2731 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg, 2814 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg,
2732 const Immediate &imm) { 2815 const Immediate &imm) {
2733 emitGenericShift(0, Ty, reg, imm); 2816 emitGenericShift(0, Ty, reg, imm);
2734 } 2817 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
2837 } 2920 }
2838 2921
2839 template <class Machine> 2922 template <class Machine>
2840 void AssemblerX86Base<Machine>::shld(Type Ty, 2923 void AssemblerX86Base<Machine>::shld(Type Ty,
2841 const typename Traits::Address &operand, 2924 const typename Traits::Address &operand,
2842 typename Traits::GPRRegister src) { 2925 typename Traits::GPRRegister src) {
2843 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2926 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2844 assert(Ty == IceType_i16 || Ty == IceType_i32); 2927 assert(Ty == IceType_i16 || Ty == IceType_i32);
2845 if (Ty == IceType_i16) 2928 if (Ty == IceType_i16)
2846 emitOperandSizeOverride(); 2929 emitOperandSizeOverride();
2930 emitAddrSizeOverridePrefix();
2847 emitRex(Ty, operand, src); 2931 emitRex(Ty, operand, src);
2848 emitUint8(0x0F); 2932 emitUint8(0x0F);
2849 emitUint8(0xA5); 2933 emitUint8(0xA5);
2850 emitOperand(gprEncoding(src), operand); 2934 emitOperand(gprEncoding(src), operand);
2851 } 2935 }
2852 2936
2853 template <class Machine> 2937 template <class Machine>
2854 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, 2938 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst,
2855 typename Traits::GPRRegister src) { 2939 typename Traits::GPRRegister src) {
2856 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2940 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 23 matching lines...) Expand all
2880 } 2964 }
2881 2965
2882 template <class Machine> 2966 template <class Machine>
2883 void AssemblerX86Base<Machine>::shrd(Type Ty, 2967 void AssemblerX86Base<Machine>::shrd(Type Ty,
2884 const typename Traits::Address &dst, 2968 const typename Traits::Address &dst,
2885 typename Traits::GPRRegister src) { 2969 typename Traits::GPRRegister src) {
2886 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2970 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2887 assert(Ty == IceType_i16 || Ty == IceType_i32); 2971 assert(Ty == IceType_i16 || Ty == IceType_i32);
2888 if (Ty == IceType_i16) 2972 if (Ty == IceType_i16)
2889 emitOperandSizeOverride(); 2973 emitOperandSizeOverride();
2974 emitAddrSizeOverridePrefix();
2890 emitRex(Ty, dst, src); 2975 emitRex(Ty, dst, src);
2891 emitUint8(0x0F); 2976 emitUint8(0x0F);
2892 emitUint8(0xAD); 2977 emitUint8(0xAD);
2893 emitOperand(gprEncoding(src), dst); 2978 emitOperand(gprEncoding(src), dst);
2894 } 2979 }
2895 2980
2896 template <class Machine> 2981 template <class Machine>
2897 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) { 2982 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) {
2898 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2983 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2899 if (Ty == IceType_i16) 2984 if (Ty == IceType_i16)
2900 emitOperandSizeOverride(); 2985 emitOperandSizeOverride();
2901 emitRexB(Ty, reg); 2986 emitRexB(Ty, reg);
2902 if (isByteSizedArithType(Ty)) 2987 if (isByteSizedArithType(Ty))
2903 emitUint8(0xF6); 2988 emitUint8(0xF6);
2904 else 2989 else
2905 emitUint8(0xF7); 2990 emitUint8(0xF7);
2906 emitRegisterOperand(3, gprEncoding(reg)); 2991 emitRegisterOperand(3, gprEncoding(reg));
2907 } 2992 }
2908 2993
2909 template <class Machine> 2994 template <class Machine>
2910 void AssemblerX86Base<Machine>::neg(Type Ty, 2995 void AssemblerX86Base<Machine>::neg(Type Ty,
2911 const typename Traits::Address &addr) { 2996 const typename Traits::Address &addr) {
2912 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2997 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2913 if (Ty == IceType_i16) 2998 if (Ty == IceType_i16)
2914 emitOperandSizeOverride(); 2999 emitOperandSizeOverride();
3000 emitAddrSizeOverridePrefix();
2915 emitRex(Ty, addr, RexRegIrrelevant); 3001 emitRex(Ty, addr, RexRegIrrelevant);
2916 if (isByteSizedArithType(Ty)) 3002 if (isByteSizedArithType(Ty))
2917 emitUint8(0xF6); 3003 emitUint8(0xF6);
2918 else 3004 else
2919 emitUint8(0xF7); 3005 emitUint8(0xF7);
2920 emitOperand(3, addr); 3006 emitOperand(3, addr);
2921 } 3007 }
2922 3008
2923 template <class Machine> 3009 template <class Machine>
2924 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) { 3010 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) {
(...skipping 10 matching lines...) Expand all
2935 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64)); 3021 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
2936 emitRexB(Ty, reg); 3022 emitRexB(Ty, reg);
2937 emitUint8(0x0F); 3023 emitUint8(0x0F);
2938 emitUint8(0xC8 | gprEncoding(reg)); 3024 emitUint8(0xC8 | gprEncoding(reg));
2939 } 3025 }
2940 3026
2941 template <class Machine> 3027 template <class Machine>
2942 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 3028 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2943 typename Traits::GPRRegister src) { 3029 typename Traits::GPRRegister src) {
2944 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3030 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2945 assert(Ty == IceType_i16 || Ty == IceType_i32); 3031 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
3032 (Traits::Is64Bit && Ty == IceType_i64));
2946 if (Ty == IceType_i16) 3033 if (Ty == IceType_i16)
2947 emitOperandSizeOverride(); 3034 emitOperandSizeOverride();
2948 emitRexRB(Ty, dst, src); 3035 emitRexRB(Ty, dst, src);
2949 emitUint8(0x0F); 3036 emitUint8(0x0F);
2950 emitUint8(0xBC); 3037 emitUint8(0xBC);
2951 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 3038 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2952 } 3039 }
2953 3040
2954 template <class Machine> 3041 template <class Machine>
2955 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 3042 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2956 const typename Traits::Address &src) { 3043 const typename Traits::Address &src) {
2957 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3044 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2958 assert(Ty == IceType_i16 || Ty == IceType_i32); 3045 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
3046 (Traits::Is64Bit && Ty == IceType_i64));
2959 if (Ty == IceType_i16) 3047 if (Ty == IceType_i16)
2960 emitOperandSizeOverride(); 3048 emitOperandSizeOverride();
3049 emitAddrSizeOverridePrefix();
2961 emitRex(Ty, src, dst); 3050 emitRex(Ty, src, dst);
2962 emitUint8(0x0F); 3051 emitUint8(0x0F);
2963 emitUint8(0xBC); 3052 emitUint8(0xBC);
2964 emitOperand(gprEncoding(dst), src); 3053 emitOperand(gprEncoding(dst), src);
2965 } 3054 }
2966 3055
2967 template <class Machine> 3056 template <class Machine>
2968 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 3057 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2969 typename Traits::GPRRegister src) { 3058 typename Traits::GPRRegister src) {
2970 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3059 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2971 assert(Ty == IceType_i16 || Ty == IceType_i32); 3060 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
3061 (Traits::Is64Bit && Ty == IceType_i64));
2972 if (Ty == IceType_i16) 3062 if (Ty == IceType_i16)
2973 emitOperandSizeOverride(); 3063 emitOperandSizeOverride();
2974 emitRexRB(Ty, dst, src); 3064 emitRexRB(Ty, dst, src);
2975 emitUint8(0x0F); 3065 emitUint8(0x0F);
2976 emitUint8(0xBD); 3066 emitUint8(0xBD);
2977 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 3067 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2978 } 3068 }
2979 3069
2980 template <class Machine> 3070 template <class Machine>
2981 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 3071 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2982 const typename Traits::Address &src) { 3072 const typename Traits::Address &src) {
2983 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3073 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2984 assert(Ty == IceType_i16 || Ty == IceType_i32); 3074 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
3075 (Traits::Is64Bit && Ty == IceType_i64));
2985 if (Ty == IceType_i16) 3076 if (Ty == IceType_i16)
2986 emitOperandSizeOverride(); 3077 emitOperandSizeOverride();
3078 emitAddrSizeOverridePrefix();
2987 emitRex(Ty, src, dst); 3079 emitRex(Ty, src, dst);
2988 emitUint8(0x0F); 3080 emitUint8(0x0F);
2989 emitUint8(0xBD); 3081 emitUint8(0xBD);
2990 emitOperand(gprEncoding(dst), src); 3082 emitOperand(gprEncoding(dst), src);
2991 } 3083 }
2992 3084
2993 template <class Machine> 3085 template <class Machine>
2994 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base, 3086 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base,
2995 typename Traits::GPRRegister offset) { 3087 typename Traits::GPRRegister offset) {
2996 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3088 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
3191 template <class Machine> 3283 template <class Machine>
3192 void AssemblerX86Base<Machine>::cmpxchg(Type Ty, 3284 void AssemblerX86Base<Machine>::cmpxchg(Type Ty,
3193 const typename Traits::Address &address, 3285 const typename Traits::Address &address,
3194 typename Traits::GPRRegister reg, 3286 typename Traits::GPRRegister reg,
3195 bool Locked) { 3287 bool Locked) {
3196 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3288 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3197 if (Ty == IceType_i16) 3289 if (Ty == IceType_i16)
3198 emitOperandSizeOverride(); 3290 emitOperandSizeOverride();
3199 if (Locked) 3291 if (Locked)
3200 emitUint8(0xF0); 3292 emitUint8(0xF0);
3293 emitAddrSizeOverridePrefix();
3201 emitRex(Ty, address, reg); 3294 emitRex(Ty, address, reg);
3202 emitUint8(0x0F); 3295 emitUint8(0x0F);
3203 if (isByteSizedArithType(Ty)) 3296 if (isByteSizedArithType(Ty))
3204 emitUint8(0xB0); 3297 emitUint8(0xB0);
3205 else 3298 else
3206 emitUint8(0xB1); 3299 emitUint8(0xB1);
3207 emitOperand(gprEncoding(reg), address); 3300 emitOperand(gprEncoding(reg), address);
3208 } 3301 }
3209 3302
3210 template <class Machine> 3303 template <class Machine>
3211 void AssemblerX86Base<Machine>::cmpxchg8b( 3304 void AssemblerX86Base<Machine>::cmpxchg8b(
3212 const typename Traits::Address &address, bool Locked) { 3305 const typename Traits::Address &address, bool Locked) {
3213 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3306 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3214 if (Locked) 3307 if (Locked)
3215 emitUint8(0xF0); 3308 emitUint8(0xF0);
3309 emitAddrSizeOverridePrefix();
3216 emitRex(IceType_i32, address, RexRegIrrelevant); 3310 emitRex(IceType_i32, address, RexRegIrrelevant);
3217 emitUint8(0x0F); 3311 emitUint8(0x0F);
3218 emitUint8(0xC7); 3312 emitUint8(0xC7);
3219 emitOperand(1, address); 3313 emitOperand(1, address);
3220 } 3314 }
3221 3315
3222 template <class Machine> 3316 template <class Machine>
3223 void AssemblerX86Base<Machine>::xadd(Type Ty, 3317 void AssemblerX86Base<Machine>::xadd(Type Ty,
3224 const typename Traits::Address &addr, 3318 const typename Traits::Address &addr,
3225 typename Traits::GPRRegister reg, 3319 typename Traits::GPRRegister reg,
3226 bool Locked) { 3320 bool Locked) {
3227 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3321 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3228 if (Ty == IceType_i16) 3322 if (Ty == IceType_i16)
3229 emitOperandSizeOverride(); 3323 emitOperandSizeOverride();
3230 if (Locked) 3324 if (Locked)
3231 emitUint8(0xF0); 3325 emitUint8(0xF0);
3326 emitAddrSizeOverridePrefix();
3232 emitRex(Ty, addr, reg); 3327 emitRex(Ty, addr, reg);
3233 emitUint8(0x0F); 3328 emitUint8(0x0F);
3234 if (isByteSizedArithType(Ty)) 3329 if (isByteSizedArithType(Ty))
3235 emitUint8(0xC0); 3330 emitUint8(0xC0);
3236 else 3331 else
3237 emitUint8(0xC1); 3332 emitUint8(0xC1);
3238 emitOperand(gprEncoding(reg), addr); 3333 emitOperand(gprEncoding(reg), addr);
3239 } 3334 }
3240 3335
3241 template <class Machine> 3336 template <class Machine>
(...skipping 19 matching lines...) Expand all
3261 } 3356 }
3262 } 3357 }
3263 3358
3264 template <class Machine> 3359 template <class Machine>
3265 void AssemblerX86Base<Machine>::xchg(Type Ty, 3360 void AssemblerX86Base<Machine>::xchg(Type Ty,
3266 const typename Traits::Address &addr, 3361 const typename Traits::Address &addr,
3267 typename Traits::GPRRegister reg) { 3362 typename Traits::GPRRegister reg) {
3268 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3363 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3269 if (Ty == IceType_i16) 3364 if (Ty == IceType_i16)
3270 emitOperandSizeOverride(); 3365 emitOperandSizeOverride();
3366 emitAddrSizeOverridePrefix();
3271 emitRex(Ty, addr, reg); 3367 emitRex(Ty, addr, reg);
3272 if (isByteSizedArithType(Ty)) 3368 if (isByteSizedArithType(Ty))
3273 emitUint8(0x86); 3369 emitUint8(0x86);
3274 else 3370 else
3275 emitUint8(0x87); 3371 emitUint8(0x87);
3276 emitOperand(gprEncoding(reg), addr); 3372 emitOperand(gprEncoding(reg), addr);
3277 } 3373 }
3278 3374
3279 template <class Machine> void AssemblerX86Base<Machine>::iaca_start() { 3375 template <class Machine> void AssemblerX86Base<Machine>::iaca_start() {
3280 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3376 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
3493 (void)shifter; 3589 (void)shifter;
3494 if (Ty == IceType_i16) 3590 if (Ty == IceType_i16)
3495 emitOperandSizeOverride(); 3591 emitOperandSizeOverride();
3496 emitRexB(Ty, operand.rm()); 3592 emitRexB(Ty, operand.rm());
3497 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); 3593 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
3498 emitOperand(rm, operand); 3594 emitOperand(rm, operand);
3499 } 3595 }
3500 3596
3501 } // end of namespace X86Internal 3597 } // end of namespace X86Internal
3502 } // end of namespace Ice 3598 } // end of namespace Ice
OLDNEW
« src/IceAssemblerX86Base.h ('K') | « src/IceAssemblerX86Base.h ('k') | src/IceInstX8664.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698