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

Side by Side Diff: src/IceAssemblerX86BaseImpl.h

Issue 1273153002: Subzero. Native 64-bit int arithmetic on x86-64. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fixes tests & make format Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceAssemblerX86Base.h ('k') | src/IceELFSection.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 const Immediate &imm) { 200 const Immediate &imm) {
201 assert(Ty != IceType_i64 && "i64 not supported yet."); 201 assert(Ty != IceType_i64 && "i64 not supported yet.");
202 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 202 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
203 if (Ty == IceType_i16) 203 if (Ty == IceType_i16)
204 emitOperandSizeOverride(); 204 emitOperandSizeOverride();
205 emitRexB(Ty, dst); 205 emitRexB(Ty, dst);
206 if (isByteSizedType(Ty)) { 206 if (isByteSizedType(Ty)) {
207 emitUint8(0xB0 + gprEncoding(dst)); 207 emitUint8(0xB0 + gprEncoding(dst));
208 emitUint8(imm.value() & 0xFF); 208 emitUint8(imm.value() & 0xFF);
209 } else { 209 } else {
210 // TODO(jpp): When removing the assertion above ensure that in x86-64 we
211 // emit a 64-bit immediate.
210 emitUint8(0xB8 + gprEncoding(dst)); 212 emitUint8(0xB8 + gprEncoding(dst));
211 emitImmediate(Ty, imm); 213 emitImmediate(Ty, imm);
212 } 214 }
213 } 215 }
214 216
215 template <class Machine> 217 template <class Machine>
216 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 218 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
217 typename Traits::GPRRegister src) { 219 typename Traits::GPRRegister src) {
218 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 220 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
219 if (Ty == IceType_i16) 221 if (Ty == IceType_i16)
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 emitOperand(0, dst); 274 emitOperand(0, dst);
273 emitUint8(imm.value() & 0xFF); 275 emitUint8(imm.value() & 0xFF);
274 } else { 276 } else {
275 emitUint8(0xC7); 277 emitUint8(0xC7);
276 emitOperand(0, dst); 278 emitOperand(0, dst);
277 emitImmediate(Ty, imm); 279 emitImmediate(Ty, imm);
278 } 280 }
279 } 281 }
280 282
281 template <class Machine> 283 template <class Machine>
284 template <typename T>
285 typename std::enable_if<T::Is64Bit, void>::type
286 AssemblerX86Base<Machine>::movabs(const typename Traits::GPRRegister Dst,
287 uint64_t Imm64) {
288 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
289 const bool NeedsRexW = (Imm64 & ~0xFFFFFFFFull) != 0;
290 const Type RexType = NeedsRexW ? RexTypeForceRexW : RexTypeIrrelevant;
291 emitRexB(RexType, Dst);
292 emitUint8(0xB8 | gprEncoding(Dst));
293 // When emitting Imm64, we don't have to mask out the upper 32 bits for
294 // emitInt32 will/should only emit a 32-bit constant. In reality, we are
295 // paranoid, so we go ahead an mask the upper bits out anyway.
296 emitInt32(Imm64 & 0xFFFFFFFF);
297 if (NeedsRexW)
298 emitInt32((Imm64 >> 32) & 0xFFFFFFFF);
299 }
300
301 template <class Machine>
282 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 302 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
283 typename Traits::GPRRegister dst, 303 typename Traits::GPRRegister dst,
284 typename Traits::GPRRegister src) { 304 typename Traits::GPRRegister src) {
305 if (Traits::Is64Bit && SrcTy == IceType_i32) {
306 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit
307 // operand to 64-bit.
308 mov(IceType_i32, dst, src);
309 return;
310 }
311
285 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 312 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
286 bool ByteSized = isByteSizedType(SrcTy); 313 bool ByteSized = isByteSizedType(SrcTy);
287 assert(ByteSized || SrcTy == IceType_i16); 314 assert(ByteSized || SrcTy == IceType_i16);
288 emitRexRB(RexTypeIrrelevant, dst, SrcTy, src); 315 emitRexRB(RexTypeIrrelevant, dst, SrcTy, src);
289 emitUint8(0x0F); 316 emitUint8(0x0F);
290 emitUint8(ByteSized ? 0xB6 : 0xB7); 317 emitUint8(ByteSized ? 0xB6 : 0xB7);
291 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 318 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
292 } 319 }
293 320
294 template <class Machine> 321 template <class Machine>
295 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 322 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
296 typename Traits::GPRRegister dst, 323 typename Traits::GPRRegister dst,
297 const typename Traits::Address &src) { 324 const typename Traits::Address &src) {
325 if (Traits::Is64Bit && SrcTy == IceType_i32) {
326 // 32-bit mov clears the upper 32 bits, hence zero-extending the 32-bit
327 // operand to 64-bit.
328 mov(IceType_i32, dst, src);
329 return;
330 }
331
298 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 332 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
299 bool ByteSized = isByteSizedType(SrcTy); 333 bool ByteSized = isByteSizedType(SrcTy);
300 assert(ByteSized || SrcTy == IceType_i16); 334 assert(ByteSized || SrcTy == IceType_i16);
301 emitRex(SrcTy, src, RexTypeIrrelevant, dst); 335 emitRex(SrcTy, src, RexTypeIrrelevant, dst);
302 emitUint8(0x0F); 336 emitUint8(0x0F);
303 emitUint8(ByteSized ? 0xB6 : 0xB7); 337 emitUint8(ByteSized ? 0xB6 : 0xB7);
304 emitOperand(gprEncoding(dst), src); 338 emitOperand(gprEncoding(dst), src);
305 } 339 }
306 340
307 template <class Machine> 341 template <class Machine>
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 386
353 template <class Machine> 387 template <class Machine>
354 void AssemblerX86Base<Machine>::cmov(Type Ty, 388 void AssemblerX86Base<Machine>::cmov(Type Ty,
355 typename Traits::Cond::BrCond cond, 389 typename Traits::Cond::BrCond cond,
356 typename Traits::GPRRegister dst, 390 typename Traits::GPRRegister dst,
357 typename Traits::GPRRegister src) { 391 typename Traits::GPRRegister src) {
358 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 392 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
359 if (Ty == IceType_i16) 393 if (Ty == IceType_i16)
360 emitOperandSizeOverride(); 394 emitOperandSizeOverride();
361 else 395 else
362 assert(Ty == IceType_i32); 396 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
363 emitRexRB(Ty, dst, src); 397 emitRexRB(Ty, dst, src);
364 emitUint8(0x0F); 398 emitUint8(0x0F);
365 emitUint8(0x40 + cond); 399 emitUint8(0x40 + cond);
366 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 400 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
367 } 401 }
368 402
369 template <class Machine> 403 template <class Machine>
370 void AssemblerX86Base<Machine>::cmov(Type Ty, 404 void AssemblerX86Base<Machine>::cmov(Type Ty,
371 typename Traits::Cond::BrCond cond, 405 typename Traits::Cond::BrCond cond,
372 typename Traits::GPRRegister dst, 406 typename Traits::GPRRegister dst,
373 const typename Traits::Address &src) { 407 const typename Traits::Address &src) {
374 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 408 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
375 if (Ty == IceType_i16) 409 if (Ty == IceType_i16)
376 emitOperandSizeOverride(); 410 emitOperandSizeOverride();
377 else 411 else
378 assert(Ty == IceType_i32); 412 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
379 emitRex(Ty, src, dst); 413 emitRex(Ty, src, dst);
380 emitUint8(0x0F); 414 emitUint8(0x0F);
381 emitUint8(0x40 + cond); 415 emitUint8(0x40 + cond);
382 emitOperand(gprEncoding(dst), src); 416 emitOperand(gprEncoding(dst), src);
383 } 417 }
384 418
385 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { 419 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() {
386 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 420 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
387 emitUint8(0xF3); 421 emitUint8(0xF3);
388 emitUint8(0xA4); 422 emitUint8(0xA4);
(...skipping 27 matching lines...) Expand all
416 typename Traits::XmmRegister src) { 450 typename Traits::XmmRegister src) {
417 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 451 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
418 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 452 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
419 emitRexRB(RexTypeIrrelevant, src, dst); 453 emitRexRB(RexTypeIrrelevant, src, dst);
420 emitUint8(0x0F); 454 emitUint8(0x0F);
421 emitUint8(0x11); 455 emitUint8(0x11);
422 emitXmmRegisterOperand(src, dst); 456 emitXmmRegisterOperand(src, dst);
423 } 457 }
424 458
425 template <class Machine> 459 template <class Machine>
426 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 460 void AssemblerX86Base<Machine>::movd(Type SrcTy,
461 typename Traits::XmmRegister dst,
427 typename Traits::GPRRegister src) { 462 typename Traits::GPRRegister src) {
428 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 463 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
429 emitUint8(0x66); 464 emitUint8(0x66);
430 emitRexRB(RexTypeIrrelevant, dst, src); 465 emitRexRB(SrcTy, dst, src);
431 emitUint8(0x0F); 466 emitUint8(0x0F);
432 emitUint8(0x6E); 467 emitUint8(0x6E);
433 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 468 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
434 } 469 }
435 470
436 template <class Machine> 471 template <class Machine>
437 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 472 void AssemblerX86Base<Machine>::movd(Type SrcTy,
473 typename Traits::XmmRegister dst,
438 const typename Traits::Address &src) { 474 const typename Traits::Address &src) {
439 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 475 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
440 emitUint8(0x66); 476 emitUint8(0x66);
441 emitRex(RexTypeIrrelevant, src, dst); 477 emitRex(SrcTy, src, dst);
442 emitUint8(0x0F); 478 emitUint8(0x0F);
443 emitUint8(0x6E); 479 emitUint8(0x6E);
444 emitOperand(gprEncoding(dst), src); 480 emitOperand(gprEncoding(dst), src);
445 } 481 }
446 482
447 template <class Machine> 483 template <class Machine>
448 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst, 484 void AssemblerX86Base<Machine>::movd(Type DestTy,
485 typename Traits::GPRRegister dst,
449 typename Traits::XmmRegister src) { 486 typename Traits::XmmRegister src) {
450 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 487 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
451 emitUint8(0x66); 488 emitUint8(0x66);
452 emitRexRB(RexTypeIrrelevant, src, dst); 489 emitRexRB(DestTy, src, dst);
453 emitUint8(0x0F); 490 emitUint8(0x0F);
454 emitUint8(0x7E); 491 emitUint8(0x7E);
455 emitRegisterOperand(gprEncoding(src), gprEncoding(dst)); 492 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
456 } 493 }
457 494
458 template <class Machine> 495 template <class Machine>
459 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst, 496 void AssemblerX86Base<Machine>::movd(Type DestTy,
497 const typename Traits::Address &dst,
460 typename Traits::XmmRegister src) { 498 typename Traits::XmmRegister src) {
461 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 499 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
462 emitUint8(0x66); 500 emitUint8(0x66);
463 emitRex(RexTypeIrrelevant, dst, src); 501 emitRex(DestTy, dst, src);
464 emitUint8(0x0F); 502 emitUint8(0x0F);
465 emitUint8(0x7E); 503 emitUint8(0x7E);
466 emitOperand(gprEncoding(src), dst); 504 emitOperand(gprEncoding(src), dst);
467 } 505 }
468 506
469 template <class Machine> 507 template <class Machine>
470 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 508 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
471 typename Traits::XmmRegister src) { 509 typename Traits::XmmRegister src) {
472 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 510 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
473 emitUint8(0xF3); 511 emitUint8(0xF3);
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 emitXmmRegisterOperand(dst, src); 1374 emitXmmRegisterOperand(dst, src);
1337 } 1375 }
1338 1376
1339 template <class Machine> 1377 template <class Machine>
1340 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst, 1378 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst,
1341 typename Traits::GPRRegister tmp1, 1379 typename Traits::GPRRegister tmp1,
1342 const Immediate &imm) { 1380 const Immediate &imm) {
1343 // Load 32-bit immediate value into tmp1. 1381 // Load 32-bit immediate value into tmp1.
1344 mov(IceType_i32, tmp1, imm); 1382 mov(IceType_i32, tmp1, imm);
1345 // Move value from tmp1 into dst. 1383 // Move value from tmp1 into dst.
1346 movd(dst, tmp1); 1384 movd(IceType_i32, dst, tmp1);
1347 // Broadcast low lane into other three lanes. 1385 // Broadcast low lane into other three lanes.
1348 shufps(RexTypeIrrelevant, dst, dst, Immediate(0x0)); 1386 shufps(RexTypeIrrelevant, dst, dst, Immediate(0x0));
1349 } 1387 }
1350 1388
1351 template <class Machine> 1389 template <class Machine>
1352 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1390 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1353 typename Traits::XmmRegister dst, 1391 typename Traits::XmmRegister dst,
1354 typename Traits::XmmRegister src, 1392 typename Traits::XmmRegister src,
1355 const Immediate &imm) { 1393 const Immediate &imm) {
1356 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1394 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 emitUint8(0xF3); 1518 emitUint8(0xF3);
1481 emitRex(RexTypeIrrelevant, src, dst); 1519 emitRex(RexTypeIrrelevant, src, dst);
1482 emitUint8(0x0F); 1520 emitUint8(0x0F);
1483 emitUint8(0x5B); 1521 emitUint8(0x5B);
1484 emitOperand(gprEncoding(dst), src); 1522 emitOperand(gprEncoding(dst), src);
1485 } 1523 }
1486 1524
1487 template <class Machine> 1525 template <class Machine>
1488 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1526 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1489 typename Traits::XmmRegister dst, 1527 typename Traits::XmmRegister dst,
1528 Type SrcTy,
1490 typename Traits::GPRRegister src) { 1529 typename Traits::GPRRegister src) {
1491 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1530 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1492 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1531 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1493 emitRexRB(RexTypeIrrelevant, dst, src); 1532 emitRexRB(SrcTy, dst, src);
1494 emitUint8(0x0F); 1533 emitUint8(0x0F);
1495 emitUint8(0x2A); 1534 emitUint8(0x2A);
1496 emitXmmRegisterOperand(dst, src); 1535 emitXmmRegisterOperand(dst, src);
1497 } 1536 }
1498 1537
1499 template <class Machine> 1538 template <class Machine>
1500 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1539 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1501 typename Traits::XmmRegister dst, 1540 typename Traits::XmmRegister dst,
1541 Type SrcTy,
1502 const typename Traits::Address &src) { 1542 const typename Traits::Address &src) {
1503 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1543 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1504 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1544 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1505 emitRex(RexTypeIrrelevant, src, dst); 1545 emitRex(SrcTy, src, dst);
1506 emitUint8(0x0F); 1546 emitUint8(0x0F);
1507 emitUint8(0x2A); 1547 emitUint8(0x2A);
1508 emitOperand(gprEncoding(dst), src); 1548 emitOperand(gprEncoding(dst), src);
1509 } 1549 }
1510 1550
1511 template <class Machine> 1551 template <class Machine>
1512 void AssemblerX86Base<Machine>::cvtfloat2float( 1552 void AssemblerX86Base<Machine>::cvtfloat2float(
1513 Type SrcTy, typename Traits::XmmRegister dst, 1553 Type SrcTy, typename Traits::XmmRegister dst,
1514 typename Traits::XmmRegister src) { 1554 typename Traits::XmmRegister src) {
1515 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1555 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 11 matching lines...) Expand all
1527 const typename Traits::Address &src) { 1567 const typename Traits::Address &src) {
1528 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1568 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1529 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1569 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1530 emitRex(RexTypeIrrelevant, src, dst); 1570 emitRex(RexTypeIrrelevant, src, dst);
1531 emitUint8(0x0F); 1571 emitUint8(0x0F);
1532 emitUint8(0x5A); 1572 emitUint8(0x5A);
1533 emitOperand(gprEncoding(dst), src); 1573 emitOperand(gprEncoding(dst), src);
1534 } 1574 }
1535 1575
1536 template <class Machine> 1576 template <class Machine>
1537 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1577 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy,
1538 typename Traits::GPRRegister dst, 1578 typename Traits::GPRRegister dst,
1579 Type SrcTy,
1539 typename Traits::XmmRegister src) { 1580 typename Traits::XmmRegister src) {
1540 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1581 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1541 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1582 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1542 emitRexRB(RexTypeIrrelevant, dst, src); 1583 emitRexRB(DestTy, dst, src);
1543 emitUint8(0x0F); 1584 emitUint8(0x0F);
1544 emitUint8(0x2C); 1585 emitUint8(0x2C);
1545 emitXmmRegisterOperand(dst, src); 1586 emitXmmRegisterOperand(dst, src);
1546 } 1587 }
1547 1588
1548 template <class Machine> 1589 template <class Machine>
1549 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1590 void AssemblerX86Base<Machine>::cvttss2si(Type DestTy,
1550 typename Traits::GPRRegister dst, 1591 typename Traits::GPRRegister dst,
1592 Type SrcTy,
1551 const typename Traits::Address &src) { 1593 const typename Traits::Address &src) {
1552 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1594 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1553 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1595 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1554 emitRex(RexTypeIrrelevant, src, dst); 1596 emitRex(DestTy, src, dst);
1555 emitUint8(0x0F); 1597 emitUint8(0x0F);
1556 emitUint8(0x2C); 1598 emitUint8(0x2C);
1557 emitOperand(gprEncoding(dst), src); 1599 emitOperand(gprEncoding(dst), src);
1558 } 1600 }
1559 1601
1560 template <class Machine> 1602 template <class Machine>
1561 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1603 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1562 typename Traits::XmmRegister b) { 1604 typename Traits::XmmRegister b) {
1563 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1605 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1564 if (Ty == IceType_f64) 1606 if (Ty == IceType_f64)
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 emitOperandSizeOverride(); 2436 emitOperandSizeOverride();
2395 emitUint8(0x99); 2437 emitUint8(0x99);
2396 } 2438 }
2397 2439
2398 template <class Machine> void AssemblerX86Base<Machine>::cdq() { 2440 template <class Machine> void AssemblerX86Base<Machine>::cdq() {
2399 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2441 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2400 emitUint8(0x99); 2442 emitUint8(0x99);
2401 } 2443 }
2402 2444
2403 template <class Machine> 2445 template <class Machine>
2446 template <typename T>
2447 typename std::enable_if<T::Is64Bit, void>::type
2448 AssemblerX86Base<Machine>::cqo() {
2449 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2450 emitRexB(RexTypeForceRexW, RexRegIrrelevant);
2451 emitUint8(0x99);
2452 }
2453
2454 template <class Machine>
2404 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) { 2455 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) {
2405 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2456 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2406 if (Ty == IceType_i16) 2457 if (Ty == IceType_i16)
2407 emitOperandSizeOverride(); 2458 emitOperandSizeOverride();
2408 emitRexB(Ty, reg); 2459 emitRexB(Ty, reg);
2409 if (isByteSizedArithType(Ty)) 2460 if (isByteSizedArithType(Ty))
2410 emitUint8(0xF6); 2461 emitUint8(0xF6);
2411 else 2462 else
2412 emitUint8(0xF7); 2463 emitUint8(0xF7);
2413 emitRegisterOperand(6, gprEncoding(reg)); 2464 emitRegisterOperand(6, gprEncoding(reg));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2452 emitUint8(0xF6); 2503 emitUint8(0xF6);
2453 else 2504 else
2454 emitUint8(0xF7); 2505 emitUint8(0xF7);
2455 emitOperand(7, addr); 2506 emitOperand(7, addr);
2456 } 2507 }
2457 2508
2458 template <class Machine> 2509 template <class Machine>
2459 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2510 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
2460 typename Traits::GPRRegister src) { 2511 typename Traits::GPRRegister src) {
2461 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2512 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2462 assert(Ty == IceType_i16 || Ty == IceType_i32); 2513 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
2514 (Traits::Is64Bit && Ty == IceType_i64));
2463 if (Ty == IceType_i16) 2515 if (Ty == IceType_i16)
2464 emitOperandSizeOverride(); 2516 emitOperandSizeOverride();
2465 emitRexRB(Ty, dst, src); 2517 emitRexRB(Ty, dst, src);
2466 emitUint8(0x0F); 2518 emitUint8(0x0F);
2467 emitUint8(0xAF); 2519 emitUint8(0xAF);
2468 emitRegisterOperand(gprEncoding(dst), gprEncoding(src)); 2520 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2469 } 2521 }
2470 2522
2471 template <class Machine> 2523 template <class Machine>
2472 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2524 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2473 const typename Traits::Address &address) { 2525 const typename Traits::Address &address) {
2474 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2526 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2475 assert(Ty == IceType_i16 || Ty == IceType_i32); 2527 assert(Ty == IceType_i16 || Ty == IceType_i32 ||
2528 (Traits::Is64Bit && Ty == IceType_i64));
2476 if (Ty == IceType_i16) 2529 if (Ty == IceType_i16)
2477 emitOperandSizeOverride(); 2530 emitOperandSizeOverride();
2478 emitRex(Ty, address, reg); 2531 emitRex(Ty, address, reg);
2479 emitUint8(0x0F); 2532 emitUint8(0x0F);
2480 emitUint8(0xAF); 2533 emitUint8(0xAF);
2481 emitOperand(gprEncoding(reg), address); 2534 emitOperand(gprEncoding(reg), address);
2482 } 2535 }
2483 2536
2484 template <class Machine> 2537 template <class Machine>
2485 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2538 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
2783 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2836 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2784 emitRexB(IceType_i32, reg); 2837 emitRexB(IceType_i32, reg);
2785 emitUint8(0xF7); 2838 emitUint8(0xF7);
2786 emitUint8(0xD0 | gprEncoding(reg)); 2839 emitUint8(0xD0 | gprEncoding(reg));
2787 } 2840 }
2788 2841
2789 template <class Machine> 2842 template <class Machine>
2790 void AssemblerX86Base<Machine>::bswap(Type Ty, 2843 void AssemblerX86Base<Machine>::bswap(Type Ty,
2791 typename Traits::GPRRegister reg) { 2844 typename Traits::GPRRegister reg) {
2792 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2845 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2793 assert(Ty == IceType_i32); 2846 assert(Ty == IceType_i32 || (Traits::Is64Bit && Ty == IceType_i64));
2794 (void)Ty;
2795 emitRexB(Ty, reg); 2847 emitRexB(Ty, reg);
2796 emitUint8(0x0F); 2848 emitUint8(0x0F);
2797 emitUint8(0xC8 | gprEncoding(reg)); 2849 emitUint8(0xC8 | gprEncoding(reg));
2798 } 2850 }
2799 2851
2800 template <class Machine> 2852 template <class Machine>
2801 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 2853 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2802 typename Traits::GPRRegister src) { 2854 typename Traits::GPRRegister src) {
2803 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2855 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2804 assert(Ty == IceType_i16 || Ty == IceType_i32); 2856 assert(Ty == IceType_i16 || Ty == IceType_i32);
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
3282 (void)shifter; 3334 (void)shifter;
3283 if (Ty == IceType_i16) 3335 if (Ty == IceType_i16)
3284 emitOperandSizeOverride(); 3336 emitOperandSizeOverride();
3285 emitRexB(Ty, operand.rm()); 3337 emitRexB(Ty, operand.rm());
3286 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); 3338 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
3287 emitOperand(rm, operand); 3339 emitOperand(rm, operand);
3288 } 3340 }
3289 3341
3290 } // end of namespace X86Internal 3342 } // end of namespace X86Internal
3291 } // end of namespace Ice 3343 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceAssemblerX86Base.h ('k') | src/IceELFSection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698