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

Side by Side Diff: src/IceInstX86BaseImpl.h

Issue 1523873003: Subzero: Separate "\t" from "opcode" in asm emission. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix dmb issue 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
« no previous file with comments | « src/IceInstMIPS32.cpp ('k') | src/IceTargetLoweringMIPS32.cpp » ('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/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=// 1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 } 429 }
430 430
431 if (Label) { 431 if (Label) {
432 Str << "\t" << Label->getName(Func); 432 Str << "\t" << Label->getName(Func);
433 } else { 433 } else {
434 if (Condition == InstX86Base<Machine>::Traits::Cond::Br_None) { 434 if (Condition == InstX86Base<Machine>::Traits::Cond::Br_None) {
435 Str << "\t" << getTargetFalse()->getAsmName(); 435 Str << "\t" << getTargetFalse()->getAsmName();
436 } else { 436 } else {
437 Str << "\t" << getTargetTrue()->getAsmName(); 437 Str << "\t" << getTargetTrue()->getAsmName();
438 if (getTargetFalse()) { 438 if (getTargetFalse()) {
439 Str << "\n\tjmp\t" << getTargetFalse()->getAsmName(); 439 Str << "\n\t"
440 "jmp\t" << getTargetFalse()->getAsmName();
440 } 441 }
441 } 442 }
442 } 443 }
443 } 444 }
444 445
445 template <class Machine> 446 template <class Machine>
446 void InstX86Br<Machine>::emitIAS(const Cfg *Func) const { 447 void InstX86Br<Machine>::emitIAS(const Cfg *Func) const {
447 typename InstX86Base<Machine>::Traits::Assembler *Asm = 448 typename InstX86Base<Machine>::Traits::Assembler *Asm =
448 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 449 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
449 if (Label) { 450 if (Label) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 } 497 }
497 498
498 Str << " // (" << (isNear() ? "near" : "far") << " jump)"; 499 Str << " // (" << (isNear() ? "near" : "far") << " jump)";
499 } 500 }
500 501
501 template <class Machine> void InstX86Jmp<Machine>::emit(const Cfg *Func) const { 502 template <class Machine> void InstX86Jmp<Machine>::emit(const Cfg *Func) const {
502 if (!BuildDefs::dump()) 503 if (!BuildDefs::dump())
503 return; 504 return;
504 Ostream &Str = Func->getContext()->getStrEmit(); 505 Ostream &Str = Func->getContext()->getStrEmit();
505 assert(this->getSrcSize() == 1); 506 assert(this->getSrcSize() == 1);
506 Str << "\tjmp\t*"; 507 Str << "\t"
508 "jmp\t*";
507 getJmpTarget()->emit(Func); 509 getJmpTarget()->emit(Func);
508 } 510 }
509 511
510 template <class Machine> 512 template <class Machine>
511 void InstX86Jmp<Machine>::emitIAS(const Cfg *Func) const { 513 void InstX86Jmp<Machine>::emitIAS(const Cfg *Func) const {
512 // Note: Adapted (mostly copied) from InstX86Call<Machine>::emitIAS(). 514 // Note: Adapted (mostly copied) from InstX86Call<Machine>::emitIAS().
513 typename InstX86Base<Machine>::Traits::Assembler *Asm = 515 typename InstX86Base<Machine>::Traits::Assembler *Asm =
514 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 516 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
515 Operand *Target = getJmpTarget(); 517 Operand *Target = getJmpTarget();
516 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { 518 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 Str << "jmp "; 555 Str << "jmp ";
554 getJmpTarget()->dump(Func); 556 getJmpTarget()->dump(Func);
555 } 557 }
556 558
557 template <class Machine> 559 template <class Machine>
558 void InstX86Call<Machine>::emit(const Cfg *Func) const { 560 void InstX86Call<Machine>::emit(const Cfg *Func) const {
559 if (!BuildDefs::dump()) 561 if (!BuildDefs::dump())
560 return; 562 return;
561 Ostream &Str = Func->getContext()->getStrEmit(); 563 Ostream &Str = Func->getContext()->getStrEmit();
562 assert(this->getSrcSize() == 1); 564 assert(this->getSrcSize() == 1);
563 Str << "\tcall\t"; 565 Str << "\t"
566 "call\t";
564 Operand *CallTarget = getCallTarget(); 567 Operand *CallTarget = getCallTarget();
565 auto *Target = InstX86Base<Machine>::getTarget(Func); 568 auto *Target = InstX86Base<Machine>::getTarget(Func);
566 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { 569 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
567 // Emit without a leading '$'. 570 // Emit without a leading '$'.
568 Str << CI->getValue(); 571 Str << CI->getValue();
569 } else if (const auto DirectCallTarget = 572 } else if (const auto DirectCallTarget =
570 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { 573 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) {
571 DirectCallTarget->emitWithoutPrefix(Target); 574 DirectCallTarget->emitWithoutPrefix(Target);
572 } else { 575 } else {
573 Str << "*"; 576 Str << "*";
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 } 993 }
991 994
992 template <class Machine> 995 template <class Machine>
993 void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const { 996 void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const {
994 if (!BuildDefs::dump()) 997 if (!BuildDefs::dump())
995 return; 998 return;
996 Ostream &Str = Func->getContext()->getStrEmit(); 999 Ostream &Str = Func->getContext()->getStrEmit();
997 assert(this->getSrcSize() == 1); 1000 assert(this->getSrcSize() == 1);
998 Type Ty = this->getSrc(0)->getType(); 1001 Type Ty = this->getSrc(0)->getType();
999 assert(isScalarFloatingType(Ty)); 1002 assert(isScalarFloatingType(Ty));
1000 Str << "\tsqrt" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString 1003 Str << "\t"
1004 "sqrt" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString
1001 << "\t"; 1005 << "\t";
1002 this->getSrc(0)->emit(Func); 1006 this->getSrc(0)->emit(Func);
1003 Str << ", "; 1007 Str << ", ";
1004 this->getDest()->emit(Func); 1008 this->getDest()->emit(Func);
1005 } 1009 }
1006 1010
1007 template <class Machine> 1011 template <class Machine>
1008 void InstX86Addss<Machine>::emit(const Cfg *Func) const { 1012 void InstX86Addss<Machine>::emit(const Cfg *Func) const {
1009 if (!BuildDefs::dump()) 1013 if (!BuildDefs::dump())
1010 return; 1014 return;
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 return; 1323 return;
1320 Ostream &Str = Func->getContext()->getStrEmit(); 1324 Ostream &Str = Func->getContext()->getStrEmit();
1321 assert(this->getSrcSize() == 2); 1325 assert(this->getSrcSize() == 2);
1322 Variable *Dest = this->getDest(); 1326 Variable *Dest = this->getDest();
1323 if (isByteSizedArithType(Dest->getType())) { 1327 if (isByteSizedArithType(Dest->getType())) {
1324 // The 8-bit version of imul only allows the form "imul r/m8". 1328 // The 8-bit version of imul only allows the form "imul r/m8".
1325 const auto *Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0)); 1329 const auto *Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0));
1326 (void)Src0Var; 1330 (void)Src0Var;
1327 assert(Src0Var->getRegNum() == 1331 assert(Src0Var->getRegNum() ==
1328 InstX86Base<Machine>::Traits::RegisterSet::Reg_al); 1332 InstX86Base<Machine>::Traits::RegisterSet::Reg_al);
1329 Str << "\timulb\t"; 1333 Str << "\t"
1334 "imulb\t";
1330 this->getSrc(1)->emit(Func); 1335 this->getSrc(1)->emit(Func);
1331 } else if (llvm::isa<Constant>(this->getSrc(1))) { 1336 } else if (llvm::isa<Constant>(this->getSrc(1))) {
1332 Str << "\timul" << this->getWidthString(Dest->getType()) << "\t"; 1337 Str << "\t"
1338 "imul" << this->getWidthString(Dest->getType()) << "\t";
1333 this->getSrc(1)->emit(Func); 1339 this->getSrc(1)->emit(Func);
1334 Str << ", "; 1340 Str << ", ";
1335 this->getSrc(0)->emit(Func); 1341 this->getSrc(0)->emit(Func);
1336 Str << ", "; 1342 Str << ", ";
1337 Dest->emit(Func); 1343 Dest->emit(Func);
1338 } else { 1344 } else {
1339 this->emitTwoAddress("imul", this, Func); 1345 this->emitTwoAddress("imul", this, Func);
1340 } 1346 }
1341 } 1347 }
1342 1348
(...skipping 29 matching lines...) Expand all
1372 1378
1373 template <class Machine> 1379 template <class Machine>
1374 void InstX86ImulImm<Machine>::emit(const Cfg *Func) const { 1380 void InstX86ImulImm<Machine>::emit(const Cfg *Func) const {
1375 if (!BuildDefs::dump()) 1381 if (!BuildDefs::dump())
1376 return; 1382 return;
1377 Ostream &Str = Func->getContext()->getStrEmit(); 1383 Ostream &Str = Func->getContext()->getStrEmit();
1378 assert(this->getSrcSize() == 2); 1384 assert(this->getSrcSize() == 2);
1379 Variable *Dest = this->getDest(); 1385 Variable *Dest = this->getDest();
1380 assert(Dest->getType() == IceType_i16 || Dest->getType() == IceType_i32); 1386 assert(Dest->getType() == IceType_i16 || Dest->getType() == IceType_i32);
1381 assert(llvm::isa<Constant>(this->getSrc(1))); 1387 assert(llvm::isa<Constant>(this->getSrc(1)));
1382 Str << "\timul" << this->getWidthString(Dest->getType()) << "\t"; 1388 Str << "\t"
1389 "imul" << this->getWidthString(Dest->getType()) << "\t";
1383 this->getSrc(1)->emit(Func); 1390 this->getSrc(1)->emit(Func);
1384 Str << ", "; 1391 Str << ", ";
1385 this->getSrc(0)->emit(Func); 1392 this->getSrc(0)->emit(Func);
1386 Str << ", "; 1393 Str << ", ";
1387 Dest->emit(Func); 1394 Dest->emit(Func);
1388 } 1395 }
1389 1396
1390 template <class Machine> 1397 template <class Machine>
1391 void InstX86ImulImm<Machine>::emitIAS(const Cfg *Func) const { 1398 void InstX86ImulImm<Machine>::emitIAS(const Cfg *Func) const {
1392 assert(this->getSrcSize() == 2); 1399 assert(this->getSrcSize() == 2);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 (void)SrcReg; 1449 (void)SrcReg;
1443 switch (Src0->getType()) { 1450 switch (Src0->getType()) {
1444 default: 1451 default:
1445 llvm_unreachable("unexpected source type!"); 1452 llvm_unreachable("unexpected source type!");
1446 break; 1453 break;
1447 case IceType_i8: 1454 case IceType_i8:
1448 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_al); 1455 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_al);
1449 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax || 1456 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax ||
1450 DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ah); 1457 DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ah);
1451 Str << "\t" 1458 Str << "\t"
1452 << "cbtw"; 1459 "cbtw";
1453 break; 1460 break;
1454 case IceType_i16: 1461 case IceType_i16:
1455 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); 1462 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax);
1456 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx); 1463 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx);
1457 Str << "\t" 1464 Str << "\t"
1458 << "cwtd"; 1465 "cwtd";
1459 break; 1466 break;
1460 case IceType_i32: 1467 case IceType_i32:
1461 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 1468 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax);
1462 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1469 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx);
1463 Str << "\t" 1470 Str << "\t"
1464 << "cltd"; 1471 "cltd";
1465 break; 1472 break;
1466 case IceType_i64: 1473 case IceType_i64:
1467 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1474 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx);
1468 Str << "\t" 1475 Str << "\t"
1469 << "cdto"; 1476 "cdto";
1470 break; 1477 break;
1471 } 1478 }
1472 } 1479 }
1473 1480
1474 template <class Machine> 1481 template <class Machine>
1475 void InstX86Cbwdq<Machine>::emitIAS(const Cfg *Func) const { 1482 void InstX86Cbwdq<Machine>::emitIAS(const Cfg *Func) const {
1476 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1483 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1477 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1484 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1478 assert(this->getSrcSize() == 1); 1485 assert(this->getSrcSize() == 1);
1479 Operand *Src0 = this->getSrc(0); 1486 Operand *Src0 = this->getSrc(0);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1512 if (!BuildDefs::dump()) 1519 if (!BuildDefs::dump())
1513 return; 1520 return;
1514 Ostream &Str = Func->getContext()->getStrEmit(); 1521 Ostream &Str = Func->getContext()->getStrEmit();
1515 assert(this->getSrcSize() == 2); 1522 assert(this->getSrcSize() == 2);
1516 assert(llvm::isa<Variable>(this->getSrc(0))); 1523 assert(llvm::isa<Variable>(this->getSrc(0)));
1517 assert(llvm::cast<Variable>(this->getSrc(0))->getRegNum() == 1524 assert(llvm::cast<Variable>(this->getSrc(0))->getRegNum() ==
1518 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 1525 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax);
1519 assert( 1526 assert(
1520 this->getDest()->getRegNum() == 1527 this->getDest()->getRegNum() ==
1521 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); // TODO: allow edx? 1528 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); // TODO: allow edx?
1522 Str << "\tmul" << this->getWidthString(this->getDest()->getType()) << "\t"; 1529 Str << "\t"
1530 "mul" << this->getWidthString(this->getDest()->getType()) << "\t";
1523 this->getSrc(1)->emit(Func); 1531 this->getSrc(1)->emit(Func);
1524 } 1532 }
1525 1533
1526 template <class Machine> 1534 template <class Machine>
1527 void InstX86Mul<Machine>::emitIAS(const Cfg *Func) const { 1535 void InstX86Mul<Machine>::emitIAS(const Cfg *Func) const {
1528 assert(this->getSrcSize() == 2); 1536 assert(this->getSrcSize() == 2);
1529 assert(llvm::isa<Variable>(this->getSrc(0))); 1537 assert(llvm::isa<Variable>(this->getSrc(0)));
1530 assert(llvm::cast<Variable>(this->getSrc(0))->getRegNum() == 1538 assert(llvm::cast<Variable>(this->getSrc(0))->getRegNum() ==
1531 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 1539 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax);
1532 assert( 1540 assert(
(...skipping 17 matching lines...) Expand all
1550 } 1558 }
1551 1559
1552 template <class Machine> 1560 template <class Machine>
1553 void InstX86Shld<Machine>::emit(const Cfg *Func) const { 1561 void InstX86Shld<Machine>::emit(const Cfg *Func) const {
1554 if (!BuildDefs::dump()) 1562 if (!BuildDefs::dump())
1555 return; 1563 return;
1556 Ostream &Str = Func->getContext()->getStrEmit(); 1564 Ostream &Str = Func->getContext()->getStrEmit();
1557 Variable *Dest = this->getDest(); 1565 Variable *Dest = this->getDest();
1558 assert(this->getSrcSize() == 3); 1566 assert(this->getSrcSize() == 3);
1559 assert(Dest == this->getSrc(0)); 1567 assert(Dest == this->getSrc(0));
1560 Str << "\tshld" << this->getWidthString(Dest->getType()) << "\t"; 1568 Str << "\t"
1569 "shld" << this->getWidthString(Dest->getType()) << "\t";
1561 this->getSrc(2)->emit(Func); 1570 this->getSrc(2)->emit(Func);
1562 Str << ", "; 1571 Str << ", ";
1563 this->getSrc(1)->emit(Func); 1572 this->getSrc(1)->emit(Func);
1564 Str << ", "; 1573 Str << ", ";
1565 Dest->emit(Func); 1574 Dest->emit(Func);
1566 } 1575 }
1567 1576
1568 template <class Machine> 1577 template <class Machine>
1569 void InstX86Shld<Machine>::emitIAS(const Cfg *Func) const { 1578 void InstX86Shld<Machine>::emitIAS(const Cfg *Func) const {
1570 assert(this->getSrcSize() == 3); 1579 assert(this->getSrcSize() == 3);
(...skipping 19 matching lines...) Expand all
1590 } 1599 }
1591 1600
1592 template <class Machine> 1601 template <class Machine>
1593 void InstX86Shrd<Machine>::emit(const Cfg *Func) const { 1602 void InstX86Shrd<Machine>::emit(const Cfg *Func) const {
1594 if (!BuildDefs::dump()) 1603 if (!BuildDefs::dump())
1595 return; 1604 return;
1596 Ostream &Str = Func->getContext()->getStrEmit(); 1605 Ostream &Str = Func->getContext()->getStrEmit();
1597 Variable *Dest = this->getDest(); 1606 Variable *Dest = this->getDest();
1598 assert(this->getSrcSize() == 3); 1607 assert(this->getSrcSize() == 3);
1599 assert(Dest == this->getSrc(0)); 1608 assert(Dest == this->getSrc(0));
1600 Str << "\tshrd" << this->getWidthString(Dest->getType()) << "\t"; 1609 Str << "\t"
1610 "shrd" << this->getWidthString(Dest->getType()) << "\t";
1601 this->getSrc(2)->emit(Func); 1611 this->getSrc(2)->emit(Func);
1602 Str << ", "; 1612 Str << ", ";
1603 this->getSrc(1)->emit(Func); 1613 this->getSrc(1)->emit(Func);
1604 Str << ", "; 1614 Str << ", ";
1605 Dest->emit(Func); 1615 Dest->emit(Func);
1606 } 1616 }
1607 1617
1608 template <class Machine> 1618 template <class Machine>
1609 void InstX86Shrd<Machine>::emitIAS(const Cfg *Func) const { 1619 void InstX86Shrd<Machine>::emitIAS(const Cfg *Func) const {
1610 assert(this->getSrcSize() == 3); 1620 assert(this->getSrcSize() == 3);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 } 1706 }
1697 1707
1698 template <class Machine> 1708 template <class Machine>
1699 void InstX86Cmpps<Machine>::emit(const Cfg *Func) const { 1709 void InstX86Cmpps<Machine>::emit(const Cfg *Func) const {
1700 if (!BuildDefs::dump()) 1710 if (!BuildDefs::dump())
1701 return; 1711 return;
1702 Ostream &Str = Func->getContext()->getStrEmit(); 1712 Ostream &Str = Func->getContext()->getStrEmit();
1703 assert(this->getSrcSize() == 2); 1713 assert(this->getSrcSize() == 2);
1704 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); 1714 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid);
1705 Type DestTy = this->Dest->getType(); 1715 Type DestTy = this->Dest->getType();
1706 Str << "\t"; 1716 Str << "\t"
1707 Str << "cmp" 1717 "cmp"
1708 << InstX86Base<Machine>::Traits::InstCmppsAttributes[Condition].EmitString 1718 << InstX86Base<Machine>::Traits::InstCmppsAttributes[Condition].EmitString
1709 << InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString 1719 << InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString
1710 << "\t"; 1720 << "\t";
1711 this->getSrc(1)->emit(Func); 1721 this->getSrc(1)->emit(Func);
1712 Str << ", "; 1722 Str << ", ";
1713 this->getDest()->emit(Func); 1723 this->getDest()->emit(Func);
1714 } 1724 }
1715 1725
1716 template <class Machine> 1726 template <class Machine>
1717 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { 1727 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const {
(...skipping 25 matching lines...) Expand all
1743 template <class Machine> 1753 template <class Machine>
1744 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { 1754 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const {
1745 if (!BuildDefs::dump()) 1755 if (!BuildDefs::dump())
1746 return; 1756 return;
1747 Ostream &Str = Func->getContext()->getStrDump(); 1757 Ostream &Str = Func->getContext()->getStrDump();
1748 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); 1758 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid);
1749 this->dumpDest(Func); 1759 this->dumpDest(Func);
1750 Str << " = cmp" 1760 Str << " = cmp"
1751 << InstX86Base<Machine>::Traits::InstCmppsAttributes[Condition].EmitString 1761 << InstX86Base<Machine>::Traits::InstCmppsAttributes[Condition].EmitString
1752 << "ps" 1762 << "ps"
1753 << "\t"; 1763 "\t";
1754 this->dumpSources(Func); 1764 this->dumpSources(Func);
1755 } 1765 }
1756 1766
1757 template <class Machine> 1767 template <class Machine>
1758 void InstX86Cmpxchg<Machine>::emit(const Cfg *Func) const { 1768 void InstX86Cmpxchg<Machine>::emit(const Cfg *Func) const {
1759 if (!BuildDefs::dump()) 1769 if (!BuildDefs::dump())
1760 return; 1770 return;
1761 Ostream &Str = Func->getContext()->getStrEmit(); 1771 Ostream &Str = Func->getContext()->getStrEmit();
1762 assert(this->getSrcSize() == 3); 1772 assert(this->getSrcSize() == 3);
1763 if (this->Locked) { 1773 if (this->Locked) {
1764 Str << "\tlock"; 1774 Str << "\t"
1775 "lock";
1765 } 1776 }
1766 Str << "\tcmpxchg" << this->getWidthString(this->getSrc(0)->getType()) 1777 Str << "\t"
1767 << "\t"; 1778 "cmpxchg" << this->getWidthString(this->getSrc(0)->getType()) << "\t";
1768 this->getSrc(2)->emit(Func); 1779 this->getSrc(2)->emit(Func);
1769 Str << ", "; 1780 Str << ", ";
1770 this->getSrc(0)->emit(Func); 1781 this->getSrc(0)->emit(Func);
1771 } 1782 }
1772 1783
1773 template <class Machine> 1784 template <class Machine>
1774 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { 1785 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const {
1775 assert(this->getSrcSize() == 3); 1786 assert(this->getSrcSize() == 3);
1776 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1787 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1777 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1788 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
(...skipping 25 matching lines...) Expand all
1803 this->dumpSources(Func); 1814 this->dumpSources(Func);
1804 } 1815 }
1805 1816
1806 template <class Machine> 1817 template <class Machine>
1807 void InstX86Cmpxchg8b<Machine>::emit(const Cfg *Func) const { 1818 void InstX86Cmpxchg8b<Machine>::emit(const Cfg *Func) const {
1808 if (!BuildDefs::dump()) 1819 if (!BuildDefs::dump())
1809 return; 1820 return;
1810 Ostream &Str = Func->getContext()->getStrEmit(); 1821 Ostream &Str = Func->getContext()->getStrEmit();
1811 assert(this->getSrcSize() == 5); 1822 assert(this->getSrcSize() == 5);
1812 if (this->Locked) { 1823 if (this->Locked) {
1813 Str << "\tlock"; 1824 Str << "\t"
1825 "lock";
1814 } 1826 }
1815 Str << "\tcmpxchg8b\t"; 1827 Str << "\t"
1828 "cmpxchg8b\t";
1816 this->getSrc(0)->emit(Func); 1829 this->getSrc(0)->emit(Func);
1817 } 1830 }
1818 1831
1819 template <class Machine> 1832 template <class Machine>
1820 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { 1833 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const {
1821 assert(this->getSrcSize() == 5); 1834 assert(this->getSrcSize() == 5);
1822 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1835 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1823 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1836 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1824 const auto Mem = 1837 const auto Mem =
1825 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 1838 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
(...skipping 16 matching lines...) Expand all
1842 } 1855 }
1843 Str << "cmpxchg8b "; 1856 Str << "cmpxchg8b ";
1844 this->dumpSources(Func); 1857 this->dumpSources(Func);
1845 } 1858 }
1846 1859
1847 template <class Machine> void InstX86Cvt<Machine>::emit(const Cfg *Func) const { 1860 template <class Machine> void InstX86Cvt<Machine>::emit(const Cfg *Func) const {
1848 if (!BuildDefs::dump()) 1861 if (!BuildDefs::dump())
1849 return; 1862 return;
1850 Ostream &Str = Func->getContext()->getStrEmit(); 1863 Ostream &Str = Func->getContext()->getStrEmit();
1851 assert(this->getSrcSize() == 1); 1864 assert(this->getSrcSize() == 1);
1852 Str << "\tcvt"; 1865 Str << "\t"
1866 "cvt";
1853 if (isTruncating()) 1867 if (isTruncating())
1854 Str << "t"; 1868 Str << "t";
1855 Str << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) 1869 Str << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
1856 ->getType()] 1870 ->getType()]
1857 .CvtString << "2" 1871 .CvtString << "2"
1858 << InstX86Base< 1872 << InstX86Base<
1859 Machine>::Traits::TypeAttributes[this->getDest()->getType()] 1873 Machine>::Traits::TypeAttributes[this->getDest()->getType()]
1860 .CvtString << "\t"; 1874 .CvtString << "\t";
1861 this->getSrc(0)->emit(Func); 1875 this->getSrc(0)->emit(Func);
1862 Str << ", "; 1876 Str << ", ";
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1967 .CvtString << " "; 1981 .CvtString << " ";
1968 this->dumpSources(Func); 1982 this->dumpSources(Func);
1969 } 1983 }
1970 1984
1971 template <class Machine> 1985 template <class Machine>
1972 void InstX86Icmp<Machine>::emit(const Cfg *Func) const { 1986 void InstX86Icmp<Machine>::emit(const Cfg *Func) const {
1973 if (!BuildDefs::dump()) 1987 if (!BuildDefs::dump())
1974 return; 1988 return;
1975 Ostream &Str = Func->getContext()->getStrEmit(); 1989 Ostream &Str = Func->getContext()->getStrEmit();
1976 assert(this->getSrcSize() == 2); 1990 assert(this->getSrcSize() == 2);
1977 Str << "\tcmp" << this->getWidthString(this->getSrc(0)->getType()) << "\t"; 1991 Str << "\t"
1992 "cmp" << this->getWidthString(this->getSrc(0)->getType()) << "\t";
1978 this->getSrc(1)->emit(Func); 1993 this->getSrc(1)->emit(Func);
1979 Str << ", "; 1994 Str << ", ";
1980 this->getSrc(0)->emit(Func); 1995 this->getSrc(0)->emit(Func);
1981 } 1996 }
1982 1997
1983 template <class Machine> 1998 template <class Machine>
1984 void InstX86Icmp<Machine>::emitIAS(const Cfg *Func) const { 1999 void InstX86Icmp<Machine>::emitIAS(const Cfg *Func) const {
1985 assert(this->getSrcSize() == 2); 2000 assert(this->getSrcSize() == 2);
1986 const Operand *Src0 = this->getSrc(0); 2001 const Operand *Src0 = this->getSrc(0);
1987 const Operand *Src1 = this->getSrc(1); 2002 const Operand *Src1 = this->getSrc(1);
(...skipping 23 matching lines...) Expand all
2011 Str << "cmp." << this->getSrc(0)->getType() << " "; 2026 Str << "cmp." << this->getSrc(0)->getType() << " ";
2012 this->dumpSources(Func); 2027 this->dumpSources(Func);
2013 } 2028 }
2014 2029
2015 template <class Machine> 2030 template <class Machine>
2016 void InstX86Ucomiss<Machine>::emit(const Cfg *Func) const { 2031 void InstX86Ucomiss<Machine>::emit(const Cfg *Func) const {
2017 if (!BuildDefs::dump()) 2032 if (!BuildDefs::dump())
2018 return; 2033 return;
2019 Ostream &Str = Func->getContext()->getStrEmit(); 2034 Ostream &Str = Func->getContext()->getStrEmit();
2020 assert(this->getSrcSize() == 2); 2035 assert(this->getSrcSize() == 2);
2021 Str << "\tucomi" 2036 Str << "\t"
2037 "ucomi"
2022 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) 2038 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
2023 ->getType()] 2039 ->getType()]
2024 .SdSsString << "\t"; 2040 .SdSsString << "\t";
2025 this->getSrc(1)->emit(Func); 2041 this->getSrc(1)->emit(Func);
2026 Str << ", "; 2042 Str << ", ";
2027 this->getSrc(0)->emit(Func); 2043 this->getSrc(0)->emit(Func);
2028 } 2044 }
2029 2045
2030 template <class Machine> 2046 template <class Machine>
2031 void InstX86Ucomiss<Machine>::emitIAS(const Cfg *Func) const { 2047 void InstX86Ucomiss<Machine>::emitIAS(const Cfg *Func) const {
(...skipping 16 matching lines...) Expand all
2048 Ostream &Str = Func->getContext()->getStrDump(); 2064 Ostream &Str = Func->getContext()->getStrDump();
2049 Str << "ucomiss." << this->getSrc(0)->getType() << " "; 2065 Str << "ucomiss." << this->getSrc(0)->getType() << " ";
2050 this->dumpSources(Func); 2066 this->dumpSources(Func);
2051 } 2067 }
2052 2068
2053 template <class Machine> void InstX86UD2<Machine>::emit(const Cfg *Func) const { 2069 template <class Machine> void InstX86UD2<Machine>::emit(const Cfg *Func) const {
2054 if (!BuildDefs::dump()) 2070 if (!BuildDefs::dump())
2055 return; 2071 return;
2056 Ostream &Str = Func->getContext()->getStrEmit(); 2072 Ostream &Str = Func->getContext()->getStrEmit();
2057 assert(this->getSrcSize() == 0); 2073 assert(this->getSrcSize() == 0);
2058 Str << "\tud2"; 2074 Str << "\t"
2075 "ud2";
2059 } 2076 }
2060 2077
2061 template <class Machine> 2078 template <class Machine>
2062 void InstX86UD2<Machine>::emitIAS(const Cfg *Func) const { 2079 void InstX86UD2<Machine>::emitIAS(const Cfg *Func) const {
2063 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2080 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2064 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2081 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2065 Asm->ud2(); 2082 Asm->ud2();
2066 } 2083 }
2067 2084
2068 template <class Machine> void InstX86UD2<Machine>::dump(const Cfg *Func) const { 2085 template <class Machine> void InstX86UD2<Machine>::dump(const Cfg *Func) const {
2069 if (!BuildDefs::dump()) 2086 if (!BuildDefs::dump())
2070 return; 2087 return;
2071 Ostream &Str = Func->getContext()->getStrDump(); 2088 Ostream &Str = Func->getContext()->getStrDump();
2072 Str << "ud2"; 2089 Str << "ud2";
2073 } 2090 }
2074 2091
2075 template <class Machine> 2092 template <class Machine>
2076 void InstX86Test<Machine>::emit(const Cfg *Func) const { 2093 void InstX86Test<Machine>::emit(const Cfg *Func) const {
2077 if (!BuildDefs::dump()) 2094 if (!BuildDefs::dump())
2078 return; 2095 return;
2079 Ostream &Str = Func->getContext()->getStrEmit(); 2096 Ostream &Str = Func->getContext()->getStrEmit();
2080 assert(this->getSrcSize() == 2); 2097 assert(this->getSrcSize() == 2);
2081 Str << "\ttest" << this->getWidthString(this->getSrc(0)->getType()) << "\t"; 2098 Str << "\t"
2099 "test" << this->getWidthString(this->getSrc(0)->getType()) << "\t";
2082 this->getSrc(1)->emit(Func); 2100 this->getSrc(1)->emit(Func);
2083 Str << ", "; 2101 Str << ", ";
2084 this->getSrc(0)->emit(Func); 2102 this->getSrc(0)->emit(Func);
2085 } 2103 }
2086 2104
2087 template <class Machine> 2105 template <class Machine>
2088 void InstX86Test<Machine>::emitIAS(const Cfg *Func) const { 2106 void InstX86Test<Machine>::emitIAS(const Cfg *Func) const {
2089 assert(this->getSrcSize() == 2); 2107 assert(this->getSrcSize() == 2);
2090 const Operand *Src0 = this->getSrc(0); 2108 const Operand *Src0 = this->getSrc(0);
2091 const Operand *Src1 = this->getSrc(1); 2109 const Operand *Src1 = this->getSrc(1);
(...skipping 23 matching lines...) Expand all
2115 Str << "test." << this->getSrc(0)->getType() << " "; 2133 Str << "test." << this->getSrc(0)->getType() << " ";
2116 this->dumpSources(Func); 2134 this->dumpSources(Func);
2117 } 2135 }
2118 2136
2119 template <class Machine> 2137 template <class Machine>
2120 void InstX86Mfence<Machine>::emit(const Cfg *Func) const { 2138 void InstX86Mfence<Machine>::emit(const Cfg *Func) const {
2121 if (!BuildDefs::dump()) 2139 if (!BuildDefs::dump())
2122 return; 2140 return;
2123 Ostream &Str = Func->getContext()->getStrEmit(); 2141 Ostream &Str = Func->getContext()->getStrEmit();
2124 assert(this->getSrcSize() == 0); 2142 assert(this->getSrcSize() == 0);
2125 Str << "\tmfence"; 2143 Str << "\t"
2144 "mfence";
2126 } 2145 }
2127 2146
2128 template <class Machine> 2147 template <class Machine>
2129 void InstX86Mfence<Machine>::emitIAS(const Cfg *Func) const { 2148 void InstX86Mfence<Machine>::emitIAS(const Cfg *Func) const {
2130 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2149 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2131 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2150 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2132 Asm->mfence(); 2151 Asm->mfence();
2133 } 2152 }
2134 2153
2135 template <class Machine> 2154 template <class Machine>
2136 void InstX86Mfence<Machine>::dump(const Cfg *Func) const { 2155 void InstX86Mfence<Machine>::dump(const Cfg *Func) const {
2137 if (!BuildDefs::dump()) 2156 if (!BuildDefs::dump())
2138 return; 2157 return;
2139 Ostream &Str = Func->getContext()->getStrDump(); 2158 Ostream &Str = Func->getContext()->getStrDump();
2140 Str << "mfence"; 2159 Str << "mfence";
2141 } 2160 }
2142 2161
2143 template <class Machine> 2162 template <class Machine>
2144 void InstX86Store<Machine>::emit(const Cfg *Func) const { 2163 void InstX86Store<Machine>::emit(const Cfg *Func) const {
2145 if (!BuildDefs::dump()) 2164 if (!BuildDefs::dump())
2146 return; 2165 return;
2147 Ostream &Str = Func->getContext()->getStrEmit(); 2166 Ostream &Str = Func->getContext()->getStrEmit();
2148 assert(this->getSrcSize() == 2); 2167 assert(this->getSrcSize() == 2);
2149 Type Ty = this->getSrc(0)->getType(); 2168 Type Ty = this->getSrc(0)->getType();
2150 Str << "\tmov" << this->getWidthString(Ty) 2169 Str << "\t"
2170 "mov" << this->getWidthString(Ty)
2151 << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString << "\t"; 2171 << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString << "\t";
2152 this->getSrc(0)->emit(Func); 2172 this->getSrc(0)->emit(Func);
2153 Str << ", "; 2173 Str << ", ";
2154 this->getSrc(1)->emit(Func); 2174 this->getSrc(1)->emit(Func);
2155 } 2175 }
2156 2176
2157 template <class Machine> 2177 template <class Machine>
2158 void InstX86Store<Machine>::emitIAS(const Cfg *Func) const { 2178 void InstX86Store<Machine>::emitIAS(const Cfg *Func) const {
2159 assert(this->getSrcSize() == 2); 2179 assert(this->getSrcSize() == 2);
2160 const Operand *Dest = this->getSrc(1); 2180 const Operand *Dest = this->getSrc(1);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2204 this->getSrc(0)->dump(Func); 2224 this->getSrc(0)->dump(Func);
2205 } 2225 }
2206 2226
2207 template <class Machine> 2227 template <class Machine>
2208 void InstX86StoreP<Machine>::emit(const Cfg *Func) const { 2228 void InstX86StoreP<Machine>::emit(const Cfg *Func) const {
2209 if (!BuildDefs::dump()) 2229 if (!BuildDefs::dump())
2210 return; 2230 return;
2211 Ostream &Str = Func->getContext()->getStrEmit(); 2231 Ostream &Str = Func->getContext()->getStrEmit();
2212 assert(this->getSrcSize() == 2); 2232 assert(this->getSrcSize() == 2);
2213 assert(isVectorType(this->getSrc(1)->getType())); 2233 assert(isVectorType(this->getSrc(1)->getType()));
2214 Str << "\tmovups\t"; 2234 Str << "\t"
2235 "movups\t";
2215 this->getSrc(0)->emit(Func); 2236 this->getSrc(0)->emit(Func);
2216 Str << ", "; 2237 Str << ", ";
2217 this->getSrc(1)->emit(Func); 2238 this->getSrc(1)->emit(Func);
2218 } 2239 }
2219 2240
2220 template <class Machine> 2241 template <class Machine>
2221 void InstX86StoreP<Machine>::emitIAS(const Cfg *Func) const { 2242 void InstX86StoreP<Machine>::emitIAS(const Cfg *Func) const {
2222 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2243 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2223 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2244 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2224 assert(this->getSrcSize() == 2); 2245 assert(this->getSrcSize() == 2);
(...skipping 22 matching lines...) Expand all
2247 2268
2248 template <class Machine> 2269 template <class Machine>
2249 void InstX86StoreQ<Machine>::emit(const Cfg *Func) const { 2270 void InstX86StoreQ<Machine>::emit(const Cfg *Func) const {
2250 if (!BuildDefs::dump()) 2271 if (!BuildDefs::dump())
2251 return; 2272 return;
2252 Ostream &Str = Func->getContext()->getStrEmit(); 2273 Ostream &Str = Func->getContext()->getStrEmit();
2253 assert(this->getSrcSize() == 2); 2274 assert(this->getSrcSize() == 2);
2254 assert(this->getSrc(1)->getType() == IceType_i64 || 2275 assert(this->getSrc(1)->getType() == IceType_i64 ||
2255 this->getSrc(1)->getType() == IceType_f64 || 2276 this->getSrc(1)->getType() == IceType_f64 ||
2256 isVectorType(this->getSrc(1)->getType())); 2277 isVectorType(this->getSrc(1)->getType()));
2257 Str << "\tmovq\t"; 2278 Str << "\t"
2279 "movq\t";
2258 this->getSrc(0)->emit(Func); 2280 this->getSrc(0)->emit(Func);
2259 Str << ", "; 2281 Str << ", ";
2260 this->getSrc(1)->emit(Func); 2282 this->getSrc(1)->emit(Func);
2261 } 2283 }
2262 2284
2263 template <class Machine> 2285 template <class Machine>
2264 void InstX86StoreQ<Machine>::emitIAS(const Cfg *Func) const { 2286 void InstX86StoreQ<Machine>::emitIAS(const Cfg *Func) const {
2265 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2287 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2266 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2288 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2267 assert(this->getSrcSize() == 2); 2289 assert(this->getSrcSize() == 2);
(...skipping 19 matching lines...) Expand all
2287 Str << ", "; 2309 Str << ", ";
2288 this->getSrc(0)->dump(Func); 2310 this->getSrc(0)->dump(Func);
2289 } 2311 }
2290 2312
2291 template <class Machine> void InstX86Lea<Machine>::emit(const Cfg *Func) const { 2313 template <class Machine> void InstX86Lea<Machine>::emit(const Cfg *Func) const {
2292 if (!BuildDefs::dump()) 2314 if (!BuildDefs::dump())
2293 return; 2315 return;
2294 Ostream &Str = Func->getContext()->getStrEmit(); 2316 Ostream &Str = Func->getContext()->getStrEmit();
2295 assert(this->getSrcSize() == 1); 2317 assert(this->getSrcSize() == 1);
2296 assert(this->getDest()->hasReg()); 2318 assert(this->getDest()->hasReg());
2297 Str << "\tleal\t"; 2319 Str << "\t"
2320 "leal\t";
2298 Operand *Src0 = this->getSrc(0); 2321 Operand *Src0 = this->getSrc(0);
2299 if (const auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { 2322 if (const auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) {
2300 Type Ty = Src0Var->getType(); 2323 Type Ty = Src0Var->getType();
2301 // lea on x86-32 doesn't accept mem128 operands, so cast VSrc0 to an 2324 // lea on x86-32 doesn't accept mem128 operands, so cast VSrc0 to an
2302 // acceptable type. 2325 // acceptable type.
2303 Src0Var->asType(isVectorType(Ty) ? IceType_i32 : Ty, Variable::NoRegister) 2326 Src0Var->asType(isVectorType(Ty) ? IceType_i32 : Ty, Variable::NoRegister)
2304 ->emit(Func); 2327 ->emit(Func);
2305 } else { 2328 } else {
2306 Src0->emit(Func); 2329 Src0->emit(Func);
2307 } 2330 }
2308 Str << ", "; 2331 Str << ", ";
2309 this->getDest()->emit(Func); 2332 this->getDest()->emit(Func);
2310 } 2333 }
2311 2334
2312 inline bool isIntegerConstant(const Operand *Op) { 2335 inline bool isIntegerConstant(const Operand *Op) {
2313 return llvm::isa<ConstantInteger32>(Op) || llvm::isa<ConstantInteger64>(Op); 2336 return llvm::isa<ConstantInteger32>(Op) || llvm::isa<ConstantInteger64>(Op);
2314 } 2337 }
2315 2338
2316 template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const { 2339 template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const {
2317 if (!BuildDefs::dump()) 2340 if (!BuildDefs::dump())
2318 return; 2341 return;
2319 Ostream &Str = Func->getContext()->getStrEmit(); 2342 Ostream &Str = Func->getContext()->getStrEmit();
2320 assert(this->getSrcSize() == 1); 2343 assert(this->getSrcSize() == 1);
2321 Operand *Src = this->getSrc(0); 2344 Operand *Src = this->getSrc(0);
2322 Type SrcTy = Src->getType(); 2345 Type SrcTy = Src->getType();
2323 Type DestTy = this->getDest()->getType(); 2346 Type DestTy = this->getDest()->getType();
2324 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 && 2347 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 &&
2325 isIntegerConstant(Src)) { 2348 isIntegerConstant(Src)) {
2326 Str << "\tmovabs\t"; 2349 Str << "\t"
2350 "movabs\t";
2327 } else { 2351 } else {
2328 Str << "\tmov" 2352 Str << "\t"
2329 << (!isScalarFloatingType(DestTy) 2353 "mov" << (!isScalarFloatingType(DestTy)
2330 ? this->getWidthString(DestTy) 2354 ? this->getWidthString(DestTy)
2331 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] 2355 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy]
2332 .SdSsString) << "\t"; 2356 .SdSsString) << "\t";
2333 } 2357 }
2334 // For an integer truncation operation, src is wider than dest. In this case, 2358 // For an integer truncation operation, src is wider than dest. In this case,
2335 // we use a mov instruction whose data width matches the narrower dest. 2359 // we use a mov instruction whose data width matches the narrower dest.
2336 // TODO: This assert disallows usages such as copying a floating 2360 // TODO: This assert disallows usages such as copying a floating
2337 // point value between a vector and a scalar (which movss is used for). Clean 2361 // point value between a vector and a scalar (which movss is used for). Clean
2338 // this up. 2362 // this up.
2339 assert( 2363 assert(
2340 InstX86Base<Machine>::getTarget(Func)->typeWidthInBytesOnStack(DestTy) == 2364 InstX86Base<Machine>::getTarget(Func)->typeWidthInBytesOnStack(DestTy) ==
2341 InstX86Base<Machine>::getTarget(Func)->typeWidthInBytesOnStack(SrcTy)); 2365 InstX86Base<Machine>::getTarget(Func)->typeWidthInBytesOnStack(SrcTy));
2342 const Operand *NewSrc = Src; 2366 const Operand *NewSrc = Src;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
2492 2516
2493 template <class Machine> 2517 template <class Machine>
2494 void InstX86Movp<Machine>::emit(const Cfg *Func) const { 2518 void InstX86Movp<Machine>::emit(const Cfg *Func) const {
2495 if (!BuildDefs::dump()) 2519 if (!BuildDefs::dump())
2496 return; 2520 return;
2497 // TODO(wala,stichnot): movups works with all vector operands, but there 2521 // TODO(wala,stichnot): movups works with all vector operands, but there
2498 // exist other instructions (movaps, movdqa, movdqu) that may perform better, 2522 // exist other instructions (movaps, movdqa, movdqu) that may perform better,
2499 // depending on the data type and alignment of the operands. 2523 // depending on the data type and alignment of the operands.
2500 Ostream &Str = Func->getContext()->getStrEmit(); 2524 Ostream &Str = Func->getContext()->getStrEmit();
2501 assert(this->getSrcSize() == 1); 2525 assert(this->getSrcSize() == 1);
2502 Str << "\tmovups\t"; 2526 Str << "\t"
2527 "movups\t";
2503 this->getSrc(0)->emit(Func); 2528 this->getSrc(0)->emit(Func);
2504 Str << ", "; 2529 Str << ", ";
2505 this->getDest()->emit(Func); 2530 this->getDest()->emit(Func);
2506 } 2531 }
2507 2532
2508 template <class Machine> 2533 template <class Machine>
2509 void InstX86Movp<Machine>::emitIAS(const Cfg *Func) const { 2534 void InstX86Movp<Machine>::emitIAS(const Cfg *Func) const {
2510 assert(this->getSrcSize() == 1); 2535 assert(this->getSrcSize() == 1);
2511 assert(isVectorType(this->getDest()->getType())); 2536 assert(isVectorType(this->getDest()->getType()));
2512 const Variable *Dest = this->getDest(); 2537 const Variable *Dest = this->getDest();
2513 const Operand *Src = this->getSrc(0); 2538 const Operand *Src = this->getSrc(0);
2514 static const typename InstX86Base< 2539 static const typename InstX86Base<
2515 Machine>::Traits::Assembler::XmmEmitterMovOps Emitter = { 2540 Machine>::Traits::Assembler::XmmEmitterMovOps Emitter = {
2516 &InstX86Base<Machine>::Traits::Assembler::movups, 2541 &InstX86Base<Machine>::Traits::Assembler::movups,
2517 &InstX86Base<Machine>::Traits::Assembler::movups, 2542 &InstX86Base<Machine>::Traits::Assembler::movups,
2518 &InstX86Base<Machine>::Traits::Assembler::movups}; 2543 &InstX86Base<Machine>::Traits::Assembler::movups};
2519 emitIASMovlikeXMM<Machine>(Func, Dest, Src, Emitter); 2544 emitIASMovlikeXMM<Machine>(Func, Dest, Src, Emitter);
2520 } 2545 }
2521 2546
2522 template <class Machine> 2547 template <class Machine>
2523 void InstX86Movq<Machine>::emit(const Cfg *Func) const { 2548 void InstX86Movq<Machine>::emit(const Cfg *Func) const {
2524 if (!BuildDefs::dump()) 2549 if (!BuildDefs::dump())
2525 return; 2550 return;
2526 Ostream &Str = Func->getContext()->getStrEmit(); 2551 Ostream &Str = Func->getContext()->getStrEmit();
2527 assert(this->getSrcSize() == 1); 2552 assert(this->getSrcSize() == 1);
2528 assert(this->getDest()->getType() == IceType_i64 || 2553 assert(this->getDest()->getType() == IceType_i64 ||
2529 this->getDest()->getType() == IceType_f64); 2554 this->getDest()->getType() == IceType_f64);
2530 Str << "\tmovq\t"; 2555 Str << "\t"
2556 "movq\t";
2531 this->getSrc(0)->emit(Func); 2557 this->getSrc(0)->emit(Func);
2532 Str << ", "; 2558 Str << ", ";
2533 this->getDest()->emit(Func); 2559 this->getDest()->emit(Func);
2534 } 2560 }
2535 2561
2536 template <class Machine> 2562 template <class Machine>
2537 void InstX86Movq<Machine>::emitIAS(const Cfg *Func) const { 2563 void InstX86Movq<Machine>::emitIAS(const Cfg *Func) const {
2538 assert(this->getSrcSize() == 1); 2564 assert(this->getSrcSize() == 1);
2539 assert(this->getDest()->getType() == IceType_i64 || 2565 assert(this->getDest()->getType() == IceType_i64 ||
2540 this->getDest()->getType() == IceType_f64); 2566 this->getDest()->getType() == IceType_f64);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2589 assert(typeWidthInBytes(Dest->getType()) > typeWidthInBytes(SrcTy)); 2615 assert(typeWidthInBytes(Dest->getType()) > typeWidthInBytes(SrcTy));
2590 emitIASRegOpTyGPR<Machine, false, true>(Func, SrcTy, Dest, Src, 2616 emitIASRegOpTyGPR<Machine, false, true>(Func, SrcTy, Dest, Src,
2591 this->Emitter); 2617 this->Emitter);
2592 } 2618 }
2593 2619
2594 template <class Machine> void InstX86Nop<Machine>::emit(const Cfg *Func) const { 2620 template <class Machine> void InstX86Nop<Machine>::emit(const Cfg *Func) const {
2595 if (!BuildDefs::dump()) 2621 if (!BuildDefs::dump())
2596 return; 2622 return;
2597 Ostream &Str = Func->getContext()->getStrEmit(); 2623 Ostream &Str = Func->getContext()->getStrEmit();
2598 // TODO: Emit the right code for each variant. 2624 // TODO: Emit the right code for each variant.
2599 Str << "\tnop\t# variant = " << Variant; 2625 Str << "\t"
2626 "nop\t# variant = " << Variant;
2600 } 2627 }
2601 2628
2602 template <class Machine> 2629 template <class Machine>
2603 void InstX86Nop<Machine>::emitIAS(const Cfg *Func) const { 2630 void InstX86Nop<Machine>::emitIAS(const Cfg *Func) const {
2604 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2631 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2605 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2632 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2606 // TODO: Emit the right code for the variant. 2633 // TODO: Emit the right code for the variant.
2607 Asm->nop(); 2634 Asm->nop();
2608 } 2635 }
2609 2636
2610 template <class Machine> void InstX86Nop<Machine>::dump(const Cfg *Func) const { 2637 template <class Machine> void InstX86Nop<Machine>::dump(const Cfg *Func) const {
2611 if (!BuildDefs::dump()) 2638 if (!BuildDefs::dump())
2612 return; 2639 return;
2613 Ostream &Str = Func->getContext()->getStrDump(); 2640 Ostream &Str = Func->getContext()->getStrDump();
2614 Str << "nop (variant = " << Variant << ")"; 2641 Str << "nop (variant = " << Variant << ")";
2615 } 2642 }
2616 2643
2617 template <class Machine> void InstX86Fld<Machine>::emit(const Cfg *Func) const { 2644 template <class Machine> void InstX86Fld<Machine>::emit(const Cfg *Func) const {
2618 if (!BuildDefs::dump()) 2645 if (!BuildDefs::dump())
2619 return; 2646 return;
2620 Ostream &Str = Func->getContext()->getStrEmit(); 2647 Ostream &Str = Func->getContext()->getStrEmit();
2621 assert(this->getSrcSize() == 1); 2648 assert(this->getSrcSize() == 1);
2622 Type Ty = this->getSrc(0)->getType(); 2649 Type Ty = this->getSrc(0)->getType();
2623 const auto *Var = llvm::dyn_cast<Variable>(this->getSrc(0)); 2650 const auto *Var = llvm::dyn_cast<Variable>(this->getSrc(0));
2624 if (Var && Var->hasReg()) { 2651 if (Var && Var->hasReg()) {
2625 // This is a physical xmm register, so we need to spill it to a temporary 2652 // This is a physical xmm register, so we need to spill it to a temporary
2626 // stack slot. Function prolog emission guarantees that there is sufficient 2653 // stack slot. Function prolog emission guarantees that there is sufficient
2627 // space to do this. 2654 // space to do this.
2628 Str << "\tmov" 2655 Str << "\t"
2629 << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString << "\t"; 2656 "mov" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString
2657 << "\t";
2630 Var->emit(Func); 2658 Var->emit(Func);
2631 Str << ", (%esp)\n"; 2659 Str << ", (%esp)\n"
2632 Str << "\tfld" << this->getFldString(Ty) << "\t" 2660 "\t"
2633 << "(%esp)"; 2661 "fld" << this->getFldString(Ty) << "\t"
2662 "(%esp)";
2634 return; 2663 return;
2635 } 2664 }
2636 Str << "\tfld" << this->getFldString(Ty) << "\t"; 2665 Str << "\t"
2666 "fld" << this->getFldString(Ty) << "\t";
2637 this->getSrc(0)->emit(Func); 2667 this->getSrc(0)->emit(Func);
2638 } 2668 }
2639 2669
2640 template <class Machine> 2670 template <class Machine>
2641 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { 2671 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
2642 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2672 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2643 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2673 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2644 assert(this->getSrcSize() == 1); 2674 assert(this->getSrcSize() == 1);
2645 const Operand *Src = this->getSrc(0); 2675 const Operand *Src = this->getSrc(0);
2646 auto *Target = InstX86Base<Machine>::getTarget(Func); 2676 auto *Target = InstX86Base<Machine>::getTarget(Func);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2685 template <class Machine> 2715 template <class Machine>
2686 void InstX86Fstp<Machine>::emit(const Cfg *Func) const { 2716 void InstX86Fstp<Machine>::emit(const Cfg *Func) const {
2687 if (!BuildDefs::dump()) 2717 if (!BuildDefs::dump())
2688 return; 2718 return;
2689 Ostream &Str = Func->getContext()->getStrEmit(); 2719 Ostream &Str = Func->getContext()->getStrEmit();
2690 assert(this->getSrcSize() == 0); 2720 assert(this->getSrcSize() == 0);
2691 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to 2721 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to
2692 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, 2722 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused,
2693 // the fstp should be kept for the SideEffects of popping the stack. 2723 // the fstp should be kept for the SideEffects of popping the stack.
2694 if (!this->getDest()) { 2724 if (!this->getDest()) {
2695 Str << "\tfstp\tst(0)"; 2725 Str << "\t"
2726 "fstp\t"
2727 "st(0)";
2696 return; 2728 return;
2697 } 2729 }
2698 Type Ty = this->getDest()->getType(); 2730 Type Ty = this->getDest()->getType();
2699 if (!this->getDest()->hasReg()) { 2731 if (!this->getDest()->hasReg()) {
2700 Str << "\tfstp" << this->getFldString(Ty) << "\t"; 2732 Str << "\t"
2733 "fstp" << this->getFldString(Ty) << "\t";
2701 this->getDest()->emit(Func); 2734 this->getDest()->emit(Func);
2702 return; 2735 return;
2703 } 2736 }
2704 // Dest is a physical (xmm) register, so st(0) needs to go through memory. 2737 // Dest is a physical (xmm) register, so st(0) needs to go through memory.
2705 // Hack this by using caller-reserved memory at the top of stack, spilling 2738 // Hack this by using caller-reserved memory at the top of stack, spilling
2706 // st(0) there, and loading it into the xmm register. 2739 // st(0) there, and loading it into the xmm register.
2707 Str << "\tfstp" << this->getFldString(Ty) << "\t" 2740 Str << "\t"
2708 << "(%esp)\n"; 2741 "fstp" << this->getFldString(Ty) << "\t"
2709 Str << "\tmov" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString 2742 "(%esp)\n";
2743 Str << "\t"
2744 "mov" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString
2710 << "\t" 2745 << "\t"
2711 << "(%esp), "; 2746 "(%esp), ";
2712 this->getDest()->emit(Func); 2747 this->getDest()->emit(Func);
2713 } 2748 }
2714 2749
2715 template <class Machine> 2750 template <class Machine>
2716 void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const { 2751 void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const {
2717 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2752 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2718 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2753 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2719 assert(this->getSrcSize() == 0); 2754 assert(this->getSrcSize() == 0);
2720 const Variable *Dest = this->getDest(); 2755 const Variable *Dest = this->getDest();
2721 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to 2756 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2946 InstX86Base<Machine>::Traits::getEncodedXmm, 2981 InstX86Base<Machine>::Traits::getEncodedXmm,
2947 InstX86Base<Machine>::Traits::getEncodedXmm>( 2982 InstX86Base<Machine>::Traits::getEncodedXmm>(
2948 Func, Ty, Dest, this->getSrc(1), this->getSrc(2), Emitter); 2983 Func, Ty, Dest, this->getSrc(1), this->getSrc(2), Emitter);
2949 } 2984 }
2950 2985
2951 template <class Machine> void InstX86Pop<Machine>::emit(const Cfg *Func) const { 2986 template <class Machine> void InstX86Pop<Machine>::emit(const Cfg *Func) const {
2952 if (!BuildDefs::dump()) 2987 if (!BuildDefs::dump())
2953 return; 2988 return;
2954 Ostream &Str = Func->getContext()->getStrEmit(); 2989 Ostream &Str = Func->getContext()->getStrEmit();
2955 assert(this->getSrcSize() == 0); 2990 assert(this->getSrcSize() == 0);
2956 Str << "\tpop\t"; 2991 Str << "\t"
2992 "pop\t";
2957 this->getDest()->emit(Func); 2993 this->getDest()->emit(Func);
2958 } 2994 }
2959 2995
2960 template <class Machine> 2996 template <class Machine>
2961 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { 2997 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const {
2962 assert(this->getSrcSize() == 0); 2998 assert(this->getSrcSize() == 0);
2963 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2999 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2964 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3000 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2965 if (this->getDest()->hasReg()) { 3001 if (this->getDest()->hasReg()) {
2966 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( 3002 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR(
(...skipping 14 matching lines...) Expand all
2981 3017
2982 template <class Machine> 3018 template <class Machine>
2983 void InstX86Push<Machine>::emit(const Cfg *Func) const { 3019 void InstX86Push<Machine>::emit(const Cfg *Func) const {
2984 if (!BuildDefs::dump()) 3020 if (!BuildDefs::dump())
2985 return; 3021 return;
2986 Ostream &Str = Func->getContext()->getStrEmit(); 3022 Ostream &Str = Func->getContext()->getStrEmit();
2987 assert(this->getSrcSize() == 1); 3023 assert(this->getSrcSize() == 1);
2988 // Push is currently only used for saving GPRs. 3024 // Push is currently only used for saving GPRs.
2989 const auto *Var = llvm::cast<Variable>(this->getSrc(0)); 3025 const auto *Var = llvm::cast<Variable>(this->getSrc(0));
2990 assert(Var->hasReg()); 3026 assert(Var->hasReg());
2991 Str << "\tpush\t"; 3027 Str << "\t"
3028 "push\t";
2992 Var->emit(Func); 3029 Var->emit(Func);
2993 } 3030 }
2994 3031
2995 template <class Machine> 3032 template <class Machine>
2996 void InstX86Push<Machine>::emitIAS(const Cfg *Func) const { 3033 void InstX86Push<Machine>::emitIAS(const Cfg *Func) const {
2997 assert(this->getSrcSize() == 1); 3034 assert(this->getSrcSize() == 1);
2998 // Push is currently only used for saving GPRs. 3035 // Push is currently only used for saving GPRs.
2999 const auto *Var = llvm::cast<Variable>(this->getSrc(0)); 3036 const auto *Var = llvm::cast<Variable>(this->getSrc(0));
3000 assert(Var->hasReg()); 3037 assert(Var->hasReg());
3001 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3038 typename InstX86Base<Machine>::Traits::Assembler *Asm =
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3053 buf, llvm::array_lengthof(buf), "psrl%s", 3090 buf, llvm::array_lengthof(buf), "psrl%s",
3054 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] 3091 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()]
3055 .PackString); 3092 .PackString);
3056 this->emitTwoAddress(buf, this, Func); 3093 this->emitTwoAddress(buf, this, Func);
3057 } 3094 }
3058 3095
3059 template <class Machine> void InstX86Ret<Machine>::emit(const Cfg *Func) const { 3096 template <class Machine> void InstX86Ret<Machine>::emit(const Cfg *Func) const {
3060 if (!BuildDefs::dump()) 3097 if (!BuildDefs::dump())
3061 return; 3098 return;
3062 Ostream &Str = Func->getContext()->getStrEmit(); 3099 Ostream &Str = Func->getContext()->getStrEmit();
3063 Str << "\tret"; 3100 Str << "\t"
3101 "ret";
3064 } 3102 }
3065 3103
3066 template <class Machine> 3104 template <class Machine>
3067 void InstX86Ret<Machine>::emitIAS(const Cfg *Func) const { 3105 void InstX86Ret<Machine>::emitIAS(const Cfg *Func) const {
3068 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3106 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3069 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3107 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3070 Asm->ret(); 3108 Asm->ret();
3071 } 3109 }
3072 3110
3073 template <class Machine> void InstX86Ret<Machine>::dump(const Cfg *Func) const { 3111 template <class Machine> void InstX86Ret<Machine>::dump(const Cfg *Func) const {
3074 if (!BuildDefs::dump()) 3112 if (!BuildDefs::dump())
3075 return; 3113 return;
3076 Ostream &Str = Func->getContext()->getStrDump(); 3114 Ostream &Str = Func->getContext()->getStrDump();
3077 Type Ty = 3115 Type Ty =
3078 (this->getSrcSize() == 0 ? IceType_void : this->getSrc(0)->getType()); 3116 (this->getSrcSize() == 0 ? IceType_void : this->getSrc(0)->getType());
3079 Str << "ret." << Ty << " "; 3117 Str << "ret." << Ty << " ";
3080 this->dumpSources(Func); 3118 this->dumpSources(Func);
3081 } 3119 }
3082 3120
3083 template <class Machine> 3121 template <class Machine>
3084 void InstX86Setcc<Machine>::emit(const Cfg *Func) const { 3122 void InstX86Setcc<Machine>::emit(const Cfg *Func) const {
3085 if (!BuildDefs::dump()) 3123 if (!BuildDefs::dump())
3086 return; 3124 return;
3087 Ostream &Str = Func->getContext()->getStrEmit(); 3125 Ostream &Str = Func->getContext()->getStrEmit();
3088 Str << "\tset" 3126 Str << "\t"
3127 "set"
3089 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString 3128 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString
3090 << "\t"; 3129 << "\t";
3091 this->Dest->emit(Func); 3130 this->Dest->emit(Func);
3092 } 3131 }
3093 3132
3094 template <class Machine> 3133 template <class Machine>
3095 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { 3134 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const {
3096 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); 3135 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None);
3097 assert(this->getDest()->getType() == IceType_i1); 3136 assert(this->getDest()->getType() == IceType_i1);
3098 assert(this->getSrcSize() == 0); 3137 assert(this->getSrcSize() == 0);
(...skipping 18 matching lines...) Expand all
3117 << " "; 3156 << " ";
3118 this->dumpDest(Func); 3157 this->dumpDest(Func);
3119 } 3158 }
3120 3159
3121 template <class Machine> 3160 template <class Machine>
3122 void InstX86Xadd<Machine>::emit(const Cfg *Func) const { 3161 void InstX86Xadd<Machine>::emit(const Cfg *Func) const {
3123 if (!BuildDefs::dump()) 3162 if (!BuildDefs::dump())
3124 return; 3163 return;
3125 Ostream &Str = Func->getContext()->getStrEmit(); 3164 Ostream &Str = Func->getContext()->getStrEmit();
3126 if (this->Locked) { 3165 if (this->Locked) {
3127 Str << "\tlock"; 3166 Str << "\t"
3167 "lock";
3128 } 3168 }
3129 Str << "\txadd" << this->getWidthString(this->getSrc(0)->getType()) << "\t"; 3169 Str << "\t"
3170 "xadd" << this->getWidthString(this->getSrc(0)->getType()) << "\t";
3130 this->getSrc(1)->emit(Func); 3171 this->getSrc(1)->emit(Func);
3131 Str << ", "; 3172 Str << ", ";
3132 this->getSrc(0)->emit(Func); 3173 this->getSrc(0)->emit(Func);
3133 } 3174 }
3134 3175
3135 template <class Machine> 3176 template <class Machine>
3136 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { 3177 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const {
3137 assert(this->getSrcSize() == 2); 3178 assert(this->getSrcSize() == 2);
3138 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3179 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3180 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
(...skipping 24 matching lines...) Expand all
3164 Type Ty = this->getSrc(0)->getType(); 3205 Type Ty = this->getSrc(0)->getType();
3165 Str << "xadd." << Ty << " "; 3206 Str << "xadd." << Ty << " ";
3166 this->dumpSources(Func); 3207 this->dumpSources(Func);
3167 } 3208 }
3168 3209
3169 template <class Machine> 3210 template <class Machine>
3170 void InstX86Xchg<Machine>::emit(const Cfg *Func) const { 3211 void InstX86Xchg<Machine>::emit(const Cfg *Func) const {
3171 if (!BuildDefs::dump()) 3212 if (!BuildDefs::dump())
3172 return; 3213 return;
3173 Ostream &Str = Func->getContext()->getStrEmit(); 3214 Ostream &Str = Func->getContext()->getStrEmit();
3174 Str << "\txchg" << this->getWidthString(this->getSrc(0)->getType()) << "\t"; 3215 Str << "\t"
3216 "xchg" << this->getWidthString(this->getSrc(0)->getType()) << "\t";
3175 this->getSrc(1)->emit(Func); 3217 this->getSrc(1)->emit(Func);
3176 Str << ", "; 3218 Str << ", ";
3177 this->getSrc(0)->emit(Func); 3219 this->getSrc(0)->emit(Func);
3178 } 3220 }
3179 3221
3180 template <class Machine> 3222 template <class Machine>
3181 void InstX86Xchg<Machine>::emitIAS(const Cfg *Func) const { 3223 void InstX86Xchg<Machine>::emitIAS(const Cfg *Func) const {
3182 assert(this->getSrcSize() == 2); 3224 assert(this->getSrcSize() == 2);
3183 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3225 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3184 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3226 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3216 Str << "xchg." << Ty << " "; 3258 Str << "xchg." << Ty << " ";
3217 this->dumpSources(Func); 3259 this->dumpSources(Func);
3218 } 3260 }
3219 3261
3220 template <class Machine> 3262 template <class Machine>
3221 void InstX86IacaStart<Machine>::emit(const Cfg *Func) const { 3263 void InstX86IacaStart<Machine>::emit(const Cfg *Func) const {
3222 if (!BuildDefs::dump()) 3264 if (!BuildDefs::dump())
3223 return; 3265 return;
3224 Ostream &Str = Func->getContext()->getStrEmit(); 3266 Ostream &Str = Func->getContext()->getStrEmit();
3225 Str << "\t# IACA_START\n" 3267 Str << "\t# IACA_START\n"
3226 << "\t.byte 0x0F, 0x0B\n" 3268 "\t.byte 0x0F, 0x0B\n"
3227 << "\tmovl\t$111, %ebx\n" 3269 "\t"
3228 << "\t.byte 0x64, 0x67, 0x90"; 3270 "movl\t$111, %ebx\n"
3271 "\t.byte 0x64, 0x67, 0x90";
3229 } 3272 }
3230 3273
3231 template <class Machine> 3274 template <class Machine>
3232 void InstX86IacaStart<Machine>::emitIAS(const Cfg *Func) const { 3275 void InstX86IacaStart<Machine>::emitIAS(const Cfg *Func) const {
3233 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3276 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3234 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3277 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3235 Asm->iaca_start(); 3278 Asm->iaca_start();
3236 } 3279 }
3237 3280
3238 template <class Machine> 3281 template <class Machine>
3239 void InstX86IacaStart<Machine>::dump(const Cfg *Func) const { 3282 void InstX86IacaStart<Machine>::dump(const Cfg *Func) const {
3240 if (!BuildDefs::dump()) 3283 if (!BuildDefs::dump())
3241 return; 3284 return;
3242 Ostream &Str = Func->getContext()->getStrDump(); 3285 Ostream &Str = Func->getContext()->getStrDump();
3243 Str << "IACA_START"; 3286 Str << "IACA_START";
3244 } 3287 }
3245 3288
3246 template <class Machine> 3289 template <class Machine>
3247 void InstX86IacaEnd<Machine>::emit(const Cfg *Func) const { 3290 void InstX86IacaEnd<Machine>::emit(const Cfg *Func) const {
3248 if (!BuildDefs::dump()) 3291 if (!BuildDefs::dump())
3249 return; 3292 return;
3250 Ostream &Str = Func->getContext()->getStrEmit(); 3293 Ostream &Str = Func->getContext()->getStrEmit();
3251 Str << "\t# IACA_END\n" 3294 Str << "\t# IACA_END\n"
3252 << "\tmovl\t$222, %ebx\n" 3295 "\t"
3253 << "\t.byte 0x64, 0x67, 0x90\n" 3296 "movl\t$222, %ebx\n"
3254 << "\t.byte 0x0F, 0x0B"; 3297 "\t.byte 0x64, 0x67, 0x90\n"
3298 "\t.byte 0x0F, 0x0B";
3255 } 3299 }
3256 3300
3257 template <class Machine> 3301 template <class Machine>
3258 void InstX86IacaEnd<Machine>::emitIAS(const Cfg *Func) const { 3302 void InstX86IacaEnd<Machine>::emitIAS(const Cfg *Func) const {
3259 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3303 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3260 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3304 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3261 Asm->iaca_end(); 3305 Asm->iaca_end();
3262 } 3306 }
3263 3307
3264 template <class Machine> 3308 template <class Machine>
3265 void InstX86IacaEnd<Machine>::dump(const Cfg *Func) const { 3309 void InstX86IacaEnd<Machine>::dump(const Cfg *Func) const {
3266 if (!BuildDefs::dump()) 3310 if (!BuildDefs::dump())
3267 return; 3311 return;
3268 Ostream &Str = Func->getContext()->getStrDump(); 3312 Ostream &Str = Func->getContext()->getStrDump();
3269 Str << "IACA_END"; 3313 Str << "IACA_END";
3270 } 3314 }
3271 3315
3272 } // end of namespace X86Internal 3316 } // end of namespace X86Internal
3273 3317
3274 } // end of namespace Ice 3318 } // end of namespace Ice
3275 3319
3276 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H 3320 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H
OLDNEW
« no previous file with comments | « src/IceInstMIPS32.cpp ('k') | src/IceTargetLoweringMIPS32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698