OLD | NEW |
1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// | 1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// |
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 // This file implements the InstX8632 and OperandX8632 classes, | 10 // This file implements the InstX8632 and OperandX8632 classes, |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 template <> | 775 template <> |
776 const x86::AssemblerX86::GPREmitterRegOp InstX8632Bsr::Emitter = { | 776 const x86::AssemblerX86::GPREmitterRegOp InstX8632Bsr::Emitter = { |
777 &x86::AssemblerX86::bsr, &x86::AssemblerX86::bsr, NULL}; | 777 &x86::AssemblerX86::bsr, &x86::AssemblerX86::bsr, NULL}; |
778 template <> | 778 template <> |
779 const x86::AssemblerX86::GPREmitterRegOp InstX8632Lea::Emitter = { | 779 const x86::AssemblerX86::GPREmitterRegOp InstX8632Lea::Emitter = { |
780 /* reg/reg and reg/imm are illegal */ NULL, &x86::AssemblerX86::lea, NULL}; | 780 /* reg/reg and reg/imm are illegal */ NULL, &x86::AssemblerX86::lea, NULL}; |
781 | 781 |
782 // Unary XMM ops | 782 // Unary XMM ops |
783 template <> | 783 template <> |
784 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Sqrtss::Emitter = { | 784 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Sqrtss::Emitter = { |
785 &x86::AssemblerX86::sqrtss, &x86::AssemblerX86::sqrtss}; | 785 &x86::AssemblerX86::sqrtss, &x86::AssemblerX86::sqrtss |
| 786 }; |
786 | 787 |
787 // Binary GPR ops | 788 // Binary GPR ops |
788 template <> | 789 template <> |
789 const x86::AssemblerX86::GPREmitterRegOp InstX8632Add::Emitter = { | 790 const x86::AssemblerX86::GPREmitterRegOp InstX8632Add::Emitter = { |
790 &x86::AssemblerX86::add, &x86::AssemblerX86::add, &x86::AssemblerX86::add}; | 791 &x86::AssemblerX86::add, &x86::AssemblerX86::add, &x86::AssemblerX86::add}; |
791 template <> | 792 template <> |
792 const x86::AssemblerX86::GPREmitterRegOp InstX8632Adc::Emitter = { | 793 const x86::AssemblerX86::GPREmitterRegOp InstX8632Adc::Emitter = { |
793 &x86::AssemblerX86::adc, &x86::AssemblerX86::adc, &x86::AssemblerX86::adc}; | 794 &x86::AssemblerX86::adc, &x86::AssemblerX86::adc, &x86::AssemblerX86::adc}; |
794 template <> | 795 template <> |
795 const x86::AssemblerX86::GPREmitterRegOp InstX8632And::Emitter = { | 796 const x86::AssemblerX86::GPREmitterRegOp InstX8632And::Emitter = { |
(...skipping 21 matching lines...) Expand all Loading... |
817 template <> | 818 template <> |
818 const x86::AssemblerX86::GPREmitterShiftOp InstX8632Shl::Emitter = { | 819 const x86::AssemblerX86::GPREmitterShiftOp InstX8632Shl::Emitter = { |
819 &x86::AssemblerX86::shl, &x86::AssemblerX86::shl}; | 820 &x86::AssemblerX86::shl, &x86::AssemblerX86::shl}; |
820 template <> | 821 template <> |
821 const x86::AssemblerX86::GPREmitterShiftOp InstX8632Shr::Emitter = { | 822 const x86::AssemblerX86::GPREmitterShiftOp InstX8632Shr::Emitter = { |
822 &x86::AssemblerX86::shr, &x86::AssemblerX86::shr}; | 823 &x86::AssemblerX86::shr, &x86::AssemblerX86::shr}; |
823 | 824 |
824 // Binary XMM ops | 825 // Binary XMM ops |
825 template <> | 826 template <> |
826 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Addss::Emitter = { | 827 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Addss::Emitter = { |
827 &x86::AssemblerX86::addss, &x86::AssemblerX86::addss}; | 828 &x86::AssemblerX86::addss, &x86::AssemblerX86::addss |
| 829 }; |
828 template <> | 830 template <> |
829 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Addps::Emitter = { | 831 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Addps::Emitter = { |
830 &x86::AssemblerX86::addps, &x86::AssemblerX86::addps}; | 832 &x86::AssemblerX86::addps, &x86::AssemblerX86::addps |
| 833 }; |
831 template <> | 834 template <> |
832 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Divss::Emitter = { | 835 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Divss::Emitter = { |
833 &x86::AssemblerX86::divss, &x86::AssemblerX86::divss}; | 836 &x86::AssemblerX86::divss, &x86::AssemblerX86::divss |
| 837 }; |
834 template <> | 838 template <> |
835 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Divps::Emitter = { | 839 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Divps::Emitter = { |
836 &x86::AssemblerX86::divps, &x86::AssemblerX86::divps}; | 840 &x86::AssemblerX86::divps, &x86::AssemblerX86::divps |
| 841 }; |
837 template <> | 842 template <> |
838 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Mulss::Emitter = { | 843 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Mulss::Emitter = { |
839 &x86::AssemblerX86::mulss, &x86::AssemblerX86::mulss}; | 844 &x86::AssemblerX86::mulss, &x86::AssemblerX86::mulss |
| 845 }; |
840 template <> | 846 template <> |
841 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Mulps::Emitter = { | 847 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Mulps::Emitter = { |
842 &x86::AssemblerX86::mulps, &x86::AssemblerX86::mulps}; | 848 &x86::AssemblerX86::mulps, &x86::AssemblerX86::mulps |
| 849 }; |
843 template <> | 850 template <> |
844 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Padd::Emitter = { | 851 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Padd::Emitter = { |
845 &x86::AssemblerX86::padd, &x86::AssemblerX86::padd}; | 852 &x86::AssemblerX86::padd, &x86::AssemblerX86::padd |
| 853 }; |
846 template <> | 854 template <> |
847 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pand::Emitter = { | 855 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pand::Emitter = { |
848 &x86::AssemblerX86::pand, &x86::AssemblerX86::pand}; | 856 &x86::AssemblerX86::pand, &x86::AssemblerX86::pand |
| 857 }; |
849 template <> | 858 template <> |
850 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pandn::Emitter = { | 859 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pandn::Emitter = { |
851 &x86::AssemblerX86::pandn, &x86::AssemblerX86::pandn}; | 860 &x86::AssemblerX86::pandn, &x86::AssemblerX86::pandn |
| 861 }; |
852 template <> | 862 template <> |
853 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pcmpeq::Emitter = { | 863 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pcmpeq::Emitter = { |
854 &x86::AssemblerX86::pcmpeq, &x86::AssemblerX86::pcmpeq}; | 864 &x86::AssemblerX86::pcmpeq, &x86::AssemblerX86::pcmpeq |
| 865 }; |
855 template <> | 866 template <> |
856 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pcmpgt::Emitter = { | 867 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pcmpgt::Emitter = { |
857 &x86::AssemblerX86::pcmpgt, &x86::AssemblerX86::pcmpgt}; | 868 &x86::AssemblerX86::pcmpgt, &x86::AssemblerX86::pcmpgt |
| 869 }; |
858 template <> | 870 template <> |
859 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pmull::Emitter = { | 871 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pmull::Emitter = { |
860 &x86::AssemblerX86::pmull, &x86::AssemblerX86::pmull}; | 872 &x86::AssemblerX86::pmull, &x86::AssemblerX86::pmull |
| 873 }; |
861 template <> | 874 template <> |
862 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pmuludq::Emitter = { | 875 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pmuludq::Emitter = { |
863 &x86::AssemblerX86::pmuludq, &x86::AssemblerX86::pmuludq}; | 876 &x86::AssemblerX86::pmuludq, &x86::AssemblerX86::pmuludq |
| 877 }; |
864 template <> | 878 template <> |
865 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Por::Emitter = { | 879 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Por::Emitter = { |
866 &x86::AssemblerX86::por, &x86::AssemblerX86::por}; | 880 &x86::AssemblerX86::por, &x86::AssemblerX86::por |
| 881 }; |
867 template <> | 882 template <> |
868 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Psub::Emitter = { | 883 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Psub::Emitter = { |
869 &x86::AssemblerX86::psub, &x86::AssemblerX86::psub}; | 884 &x86::AssemblerX86::psub, &x86::AssemblerX86::psub |
| 885 }; |
870 template <> | 886 template <> |
871 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pxor::Emitter = { | 887 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Pxor::Emitter = { |
872 &x86::AssemblerX86::pxor, &x86::AssemblerX86::pxor}; | 888 &x86::AssemblerX86::pxor, &x86::AssemblerX86::pxor |
| 889 }; |
873 template <> | 890 template <> |
874 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Subss::Emitter = { | 891 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Subss::Emitter = { |
875 &x86::AssemblerX86::subss, &x86::AssemblerX86::subss}; | 892 &x86::AssemblerX86::subss, &x86::AssemblerX86::subss |
| 893 }; |
876 template <> | 894 template <> |
877 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Subps::Emitter = { | 895 const x86::AssemblerX86::XmmEmitterRegOp InstX8632Subps::Emitter = { |
878 &x86::AssemblerX86::subps, &x86::AssemblerX86::subps}; | 896 &x86::AssemblerX86::subps, &x86::AssemblerX86::subps |
| 897 }; |
879 | 898 |
880 // Binary XMM Shift ops | 899 // Binary XMM Shift ops |
881 template <> | 900 template <> |
882 const x86::AssemblerX86::XmmEmitterShiftOp InstX8632Psll::Emitter = { | 901 const x86::AssemblerX86::XmmEmitterShiftOp InstX8632Psll::Emitter = { |
883 &x86::AssemblerX86::psll, &x86::AssemblerX86::psll, | 902 &x86::AssemblerX86::psll, &x86::AssemblerX86::psll, |
884 &x86::AssemblerX86::psll}; | 903 &x86::AssemblerX86::psll}; |
885 template <> | 904 template <> |
886 const x86::AssemblerX86::XmmEmitterShiftOp InstX8632Psra::Emitter = { | 905 const x86::AssemblerX86::XmmEmitterShiftOp InstX8632Psra::Emitter = { |
887 &x86::AssemblerX86::psra, &x86::AssemblerX86::psra, | 906 &x86::AssemblerX86::psra, &x86::AssemblerX86::psra, |
888 &x86::AssemblerX86::psra}; | 907 &x86::AssemblerX86::psra}; |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1420 getSrc(1)->emit(Func); | 1439 getSrc(1)->emit(Func); |
1421 Str << "\n"; | 1440 Str << "\n"; |
1422 } | 1441 } |
1423 | 1442 |
1424 void InstX8632Icmp::emitIAS(const Cfg *Func) const { | 1443 void InstX8632Icmp::emitIAS(const Cfg *Func) const { |
1425 assert(getSrcSize() == 2); | 1444 assert(getSrcSize() == 2); |
1426 const Operand *Src0 = getSrc(0); | 1445 const Operand *Src0 = getSrc(0); |
1427 const Operand *Src1 = getSrc(1); | 1446 const Operand *Src1 = getSrc(1); |
1428 Type Ty = Src0->getType(); | 1447 Type Ty = Src0->getType(); |
1429 static const x86::AssemblerX86::GPREmitterRegOp RegEmitter = { | 1448 static const x86::AssemblerX86::GPREmitterRegOp RegEmitter = { |
1430 &x86::AssemblerX86::cmp, &x86::AssemblerX86::cmp, | 1449 &x86::AssemblerX86::cmp, &x86::AssemblerX86::cmp, &x86::AssemblerX86::cmp |
1431 &x86::AssemblerX86::cmp}; | 1450 }; |
1432 static const x86::AssemblerX86::GPREmitterAddrOp AddrEmitter = { | 1451 static const x86::AssemblerX86::GPREmitterAddrOp AddrEmitter = { |
1433 &x86::AssemblerX86::cmp, &x86::AssemblerX86::cmp}; | 1452 &x86::AssemblerX86::cmp, &x86::AssemblerX86::cmp |
| 1453 }; |
1434 if (const Variable *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { | 1454 if (const Variable *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
1435 if (SrcVar0->hasReg()) { | 1455 if (SrcVar0->hasReg()) { |
1436 emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); | 1456 emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); |
1437 } else { | 1457 } else { |
1438 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) | 1458 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) |
1439 ->stackVarToAsmOperand(SrcVar0)); | 1459 ->stackVarToAsmOperand(SrcVar0)); |
1440 emitIASAddrOpTyGPR(Func, Ty, StackAddr, Src1, AddrEmitter); | 1460 emitIASAddrOpTyGPR(Func, Ty, StackAddr, Src1, AddrEmitter); |
1441 } | 1461 } |
1442 } else if (const OperandX8632Mem *SrcMem0 = | 1462 } else if (const OperandX8632Mem *SrcMem0 = |
1443 llvm::dyn_cast<OperandX8632Mem>(Src0)) { | 1463 llvm::dyn_cast<OperandX8632Mem>(Src0)) { |
(...skipping 20 matching lines...) Expand all Loading... |
1464 } | 1484 } |
1465 | 1485 |
1466 void InstX8632Ucomiss::emitIAS(const Cfg *Func) const { | 1486 void InstX8632Ucomiss::emitIAS(const Cfg *Func) const { |
1467 assert(getSrcSize() == 2); | 1487 assert(getSrcSize() == 2); |
1468 // Currently src0 is always a variable by convention, to avoid having | 1488 // Currently src0 is always a variable by convention, to avoid having |
1469 // two memory operands. | 1489 // two memory operands. |
1470 assert(llvm::isa<Variable>(getSrc(0))); | 1490 assert(llvm::isa<Variable>(getSrc(0))); |
1471 const Variable *Src0 = llvm::cast<Variable>(getSrc(0)); | 1491 const Variable *Src0 = llvm::cast<Variable>(getSrc(0)); |
1472 Type Ty = Src0->getType(); | 1492 Type Ty = Src0->getType(); |
1473 const static x86::AssemblerX86::XmmEmitterRegOp Emitter = { | 1493 const static x86::AssemblerX86::XmmEmitterRegOp Emitter = { |
1474 &x86::AssemblerX86::ucomiss, &x86::AssemblerX86::ucomiss}; | 1494 &x86::AssemblerX86::ucomiss, &x86::AssemblerX86::ucomiss |
| 1495 }; |
1475 emitIASRegOpTyXMM(Func, Ty, Src0, getSrc(1), Emitter); | 1496 emitIASRegOpTyXMM(Func, Ty, Src0, getSrc(1), Emitter); |
1476 } | 1497 } |
1477 | 1498 |
1478 void InstX8632Ucomiss::dump(const Cfg *Func) const { | 1499 void InstX8632Ucomiss::dump(const Cfg *Func) const { |
1479 Ostream &Str = Func->getContext()->getStrDump(); | 1500 Ostream &Str = Func->getContext()->getStrDump(); |
1480 Str << "ucomiss." << getSrc(0)->getType() << " "; | 1501 Str << "ucomiss." << getSrc(0)->getType() << " "; |
1481 dumpSources(Func); | 1502 dumpSources(Func); |
1482 } | 1503 } |
1483 | 1504 |
1484 void InstX8632UD2::emit(const Cfg *Func) const { | 1505 void InstX8632UD2::emit(const Cfg *Func) const { |
(...skipping 25 matching lines...) Expand all Loading... |
1510 Str << "\n"; | 1531 Str << "\n"; |
1511 } | 1532 } |
1512 | 1533 |
1513 void InstX8632Test::emitIAS(const Cfg *Func) const { | 1534 void InstX8632Test::emitIAS(const Cfg *Func) const { |
1514 assert(getSrcSize() == 2); | 1535 assert(getSrcSize() == 2); |
1515 const Operand *Src0 = getSrc(0); | 1536 const Operand *Src0 = getSrc(0); |
1516 const Operand *Src1 = getSrc(1); | 1537 const Operand *Src1 = getSrc(1); |
1517 Type Ty = Src0->getType(); | 1538 Type Ty = Src0->getType(); |
1518 // The Reg/Addr form of test is not encodeable. | 1539 // The Reg/Addr form of test is not encodeable. |
1519 static const x86::AssemblerX86::GPREmitterRegOp RegEmitter = { | 1540 static const x86::AssemblerX86::GPREmitterRegOp RegEmitter = { |
1520 &x86::AssemblerX86::test, NULL, &x86::AssemblerX86::test}; | 1541 &x86::AssemblerX86::test, NULL, &x86::AssemblerX86::test |
| 1542 }; |
1521 static const x86::AssemblerX86::GPREmitterAddrOp AddrEmitter = { | 1543 static const x86::AssemblerX86::GPREmitterAddrOp AddrEmitter = { |
1522 &x86::AssemblerX86::test, &x86::AssemblerX86::test}; | 1544 &x86::AssemblerX86::test, &x86::AssemblerX86::test |
| 1545 }; |
1523 if (const Variable *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { | 1546 if (const Variable *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
1524 if (SrcVar0->hasReg()) { | 1547 if (SrcVar0->hasReg()) { |
1525 emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); | 1548 emitIASRegOpTyGPR(Func, Ty, SrcVar0, Src1, RegEmitter); |
1526 } else { | 1549 } else { |
1527 llvm_unreachable("Nothing actually generates this so it's untested"); | 1550 llvm_unreachable("Nothing actually generates this so it's untested"); |
1528 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) | 1551 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) |
1529 ->stackVarToAsmOperand(SrcVar0)); | 1552 ->stackVarToAsmOperand(SrcVar0)); |
1530 emitIASAddrOpTyGPR(Func, Ty, StackAddr, Src1, AddrEmitter); | 1553 emitIASAddrOpTyGPR(Func, Ty, StackAddr, Src1, AddrEmitter); |
1531 } | 1554 } |
1532 } else if (const OperandX8632Mem *SrcMem0 = | 1555 } else if (const OperandX8632Mem *SrcMem0 = |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 getSrc(0)->emit(Func); | 1786 getSrc(0)->emit(Func); |
1764 Str << "\n"; | 1787 Str << "\n"; |
1765 } | 1788 } |
1766 | 1789 |
1767 template <> void InstX8632Movp::emitIAS(const Cfg *Func) const { | 1790 template <> void InstX8632Movp::emitIAS(const Cfg *Func) const { |
1768 assert(getSrcSize() == 1); | 1791 assert(getSrcSize() == 1); |
1769 assert(isVectorType(getDest()->getType())); | 1792 assert(isVectorType(getDest()->getType())); |
1770 const Variable *Dest = getDest(); | 1793 const Variable *Dest = getDest(); |
1771 const Operand *Src = getSrc(0); | 1794 const Operand *Src = getSrc(0); |
1772 const static x86::AssemblerX86::XmmEmitterMovOps Emitter = { | 1795 const static x86::AssemblerX86::XmmEmitterMovOps Emitter = { |
1773 &x86::AssemblerX86::movups, &x86::AssemblerX86::movups, | 1796 &x86::AssemblerX86::movups, &x86::AssemblerX86::movups, |
1774 &x86::AssemblerX86::movups}; | 1797 &x86::AssemblerX86::movups |
| 1798 }; |
1775 emitIASMovlikeXMM(Func, Dest, Src, Emitter); | 1799 emitIASMovlikeXMM(Func, Dest, Src, Emitter); |
1776 } | 1800 } |
1777 | 1801 |
1778 template <> void InstX8632Movq::emit(const Cfg *Func) const { | 1802 template <> void InstX8632Movq::emit(const Cfg *Func) const { |
1779 Ostream &Str = Func->getContext()->getStrEmit(); | 1803 Ostream &Str = Func->getContext()->getStrEmit(); |
1780 assert(getSrcSize() == 1); | 1804 assert(getSrcSize() == 1); |
1781 assert(getDest()->getType() == IceType_i64 || | 1805 assert(getDest()->getType() == IceType_i64 || |
1782 getDest()->getType() == IceType_f64); | 1806 getDest()->getType() == IceType_f64); |
1783 Str << "\tmovq\t"; | 1807 Str << "\tmovq\t"; |
1784 getDest()->emit(Func); | 1808 getDest()->emit(Func); |
1785 Str << ", "; | 1809 Str << ", "; |
1786 getSrc(0)->emit(Func); | 1810 getSrc(0)->emit(Func); |
1787 Str << "\n"; | 1811 Str << "\n"; |
1788 } | 1812 } |
1789 | 1813 |
1790 template <> void InstX8632Movq::emitIAS(const Cfg *Func) const { | 1814 template <> void InstX8632Movq::emitIAS(const Cfg *Func) const { |
1791 assert(getSrcSize() == 1); | 1815 assert(getSrcSize() == 1); |
1792 assert(getDest()->getType() == IceType_i64 || | 1816 assert(getDest()->getType() == IceType_i64 || |
1793 getDest()->getType() == IceType_f64); | 1817 getDest()->getType() == IceType_f64); |
1794 const Variable *Dest = getDest(); | 1818 const Variable *Dest = getDest(); |
1795 const Operand *Src = getSrc(0); | 1819 const Operand *Src = getSrc(0); |
1796 const static x86::AssemblerX86::XmmEmitterMovOps Emitter = { | 1820 const static x86::AssemblerX86::XmmEmitterMovOps Emitter = { |
1797 &x86::AssemblerX86::movq, &x86::AssemblerX86::movq, | 1821 &x86::AssemblerX86::movq, &x86::AssemblerX86::movq, &x86::AssemblerX86::movq |
1798 &x86::AssemblerX86::movq}; | 1822 }; |
1799 emitIASMovlikeXMM(Func, Dest, Src, Emitter); | 1823 emitIASMovlikeXMM(Func, Dest, Src, Emitter); |
1800 } | 1824 } |
1801 | 1825 |
1802 template <> void InstX8632MovssRegs::emitIAS(const Cfg *Func) const { | 1826 template <> void InstX8632MovssRegs::emitIAS(const Cfg *Func) const { |
1803 // This is Binop variant is only intended to be used for reg-reg moves | 1827 // This is Binop variant is only intended to be used for reg-reg moves |
1804 // where part of the Dest register is untouched. | 1828 // where part of the Dest register is untouched. |
1805 assert(getSrcSize() == 2); | 1829 assert(getSrcSize() == 2); |
1806 const Variable *Dest = getDest(); | 1830 const Variable *Dest = getDest(); |
1807 assert(Dest == getSrc(0)); | 1831 assert(Dest == getSrc(0)); |
1808 const Variable *Src = llvm::cast<Variable>(getSrc(1)); | 1832 const Variable *Src = llvm::cast<Variable>(getSrc(1)); |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2366 } | 2390 } |
2367 Str << "("; | 2391 Str << "("; |
2368 if (Func) | 2392 if (Func) |
2369 Var->dump(Func); | 2393 Var->dump(Func); |
2370 else | 2394 else |
2371 Var->dump(Str); | 2395 Var->dump(Str); |
2372 Str << ")"; | 2396 Str << ")"; |
2373 } | 2397 } |
2374 | 2398 |
2375 } // end of namespace Ice | 2399 } // end of namespace Ice |
OLD | NEW |