OLD | NEW |
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 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 getJmpTarget()->dump(Func); | 562 getJmpTarget()->dump(Func); |
563 } | 563 } |
564 | 564 |
565 template <class Machine> | 565 template <class Machine> |
566 void InstX86Call<Machine>::emit(const Cfg *Func) const { | 566 void InstX86Call<Machine>::emit(const Cfg *Func) const { |
567 if (!BuildDefs::dump()) | 567 if (!BuildDefs::dump()) |
568 return; | 568 return; |
569 Ostream &Str = Func->getContext()->getStrEmit(); | 569 Ostream &Str = Func->getContext()->getStrEmit(); |
570 assert(this->getSrcSize() == 1); | 570 assert(this->getSrcSize() == 1); |
571 Str << "\tcall\t"; | 571 Str << "\tcall\t"; |
572 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(getCallTarget())) { | 572 Operand *CallTarget = getCallTarget(); |
| 573 TargetLowering *Target = Func->getTarget(); |
| 574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { |
573 // Emit without a leading '$'. | 575 // Emit without a leading '$'. |
574 Str << CI->getValue(); | 576 Str << CI->getValue(); |
575 } else if (const auto CallTarget = | 577 } else if (const auto DirectCallTarget = |
576 llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) { | 578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
577 CallTarget->emitWithoutPrefix(Func->getTarget()); | 579 DirectCallTarget->emitWithoutPrefix(Target); |
578 } else { | 580 } else { |
579 Str << "*"; | 581 Str << "*"; |
580 getCallTarget()->emit(Func); | 582 CallTarget->emit(Func); |
581 } | 583 } |
582 Func->getTarget()->resetStackAdjustment(); | 584 Target->resetStackAdjustment(); |
583 } | 585 } |
584 | 586 |
585 template <class Machine> | 587 template <class Machine> |
586 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { | 588 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { |
587 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 589 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
588 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 590 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
589 Operand *Target = getCallTarget(); | 591 Operand *CallTarget = getCallTarget(); |
590 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { | 592 TargetLowering *Target = Func->getTarget(); |
| 593 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) { |
591 if (Var->hasReg()) { | 594 if (Var->hasReg()) { |
592 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); | 595 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
593 } else { | 596 } else { |
594 Asm->call( | 597 Asm->call( |
595 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 598 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
596 Func->getTarget()) | 599 Target) |
597 ->stackVarToAsmOperand(Var)); | 600 ->stackVarToAsmOperand(Var)); |
598 } | 601 } |
599 } else if (const auto *Mem = llvm::dyn_cast< | 602 } else if (const auto *Mem = llvm::dyn_cast< |
600 typename InstX86Base<Machine>::Traits::X86OperandMem>( | 603 typename InstX86Base<Machine>::Traits::X86OperandMem>( |
601 Target)) { | 604 CallTarget)) { |
602 assert(Mem->getSegmentRegister() == | 605 assert(Mem->getSegmentRegister() == |
603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 606 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
604 Asm->call(Mem->toAsmAddress(Asm)); | 607 Asm->call(Mem->toAsmAddress(Asm, Target)); |
605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { | 608 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
606 assert(CR->getOffset() == 0 && "We only support calling a function"); | 609 assert(CR->getOffset() == 0 && "We only support calling a function"); |
607 Asm->call(CR); | 610 Asm->call(CR); |
608 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { | 611 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { |
609 Asm->call(Immediate(Imm->getValue())); | 612 Asm->call(Immediate(Imm->getValue())); |
610 } else { | 613 } else { |
611 llvm_unreachable("Unexpected operand type"); | 614 llvm_unreachable("Unexpected operand type"); |
612 } | 615 } |
613 Func->getTarget()->resetStackAdjustment(); | 616 Target->resetStackAdjustment(); |
614 } | 617 } |
615 | 618 |
616 template <class Machine> | 619 template <class Machine> |
617 void InstX86Call<Machine>::dump(const Cfg *Func) const { | 620 void InstX86Call<Machine>::dump(const Cfg *Func) const { |
618 if (!BuildDefs::dump()) | 621 if (!BuildDefs::dump()) |
619 return; | 622 return; |
620 Ostream &Str = Func->getContext()->getStrDump(); | 623 Ostream &Str = Func->getContext()->getStrDump(); |
621 if (this->getDest()) { | 624 if (this->getDest()) { |
622 this->dumpDest(Func); | 625 this->dumpDest(Func); |
623 Str << " = "; | 626 Str << " = "; |
(...skipping 20 matching lines...) Expand all Loading... |
644 << "\t"; | 647 << "\t"; |
645 Src1->emit(Func); | 648 Src1->emit(Func); |
646 Str << ", "; | 649 Str << ", "; |
647 Dest->emit(Func); | 650 Dest->emit(Func); |
648 } | 651 } |
649 | 652 |
650 template <class Machine> | 653 template <class Machine> |
651 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, | 654 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, |
652 const typename InstX86Base< | 655 const typename InstX86Base< |
653 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { | 656 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { |
| 657 TargetLowering *Target = Func->getTarget(); |
654 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 658 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
655 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 659 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
656 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { | 660 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { |
657 if (Var->hasReg()) { | 661 if (Var->hasReg()) { |
658 // We cheat a little and use GPRRegister even for byte operations. | 662 // We cheat a little and use GPRRegister even for byte operations. |
659 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = | 663 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
660 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); | 664 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
661 (Asm->*(Emitter.Reg))(Ty, VarReg); | 665 (Asm->*(Emitter.Reg))(Ty, VarReg); |
662 } else { | 666 } else { |
663 typename InstX86Base<Machine>::Traits::Address StackAddr( | 667 typename InstX86Base<Machine>::Traits::Address StackAddr( |
664 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 668 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
665 Func->getTarget()) | 669 Target) |
666 ->stackVarToAsmOperand(Var)); | 670 ->stackVarToAsmOperand(Var)); |
667 (Asm->*(Emitter.Addr))(Ty, StackAddr); | 671 (Asm->*(Emitter.Addr))(Ty, StackAddr); |
668 } | 672 } |
669 } else if (const auto *Mem = llvm::dyn_cast< | 673 } else if (const auto *Mem = llvm::dyn_cast< |
670 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { | 674 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { |
671 Mem->emitSegmentOverride(Asm); | 675 Mem->emitSegmentOverride(Asm); |
672 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm)); | 676 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Target)); |
673 } else { | 677 } else { |
674 llvm_unreachable("Unexpected operand type"); | 678 llvm_unreachable("Unexpected operand type"); |
675 } | 679 } |
676 } | 680 } |
677 | 681 |
678 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> | 682 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> |
679 void emitIASRegOpTyGPR( | 683 void emitIASRegOpTyGPR( |
680 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 684 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
681 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp | 685 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp |
682 &Emitter) { | 686 &Emitter) { |
| 687 TargetLowering *Target = Func->getTarget(); |
683 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 688 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
684 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 689 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
685 assert(Var->hasReg()); | 690 assert(Var->hasReg()); |
686 // We cheat a little and use GPRRegister even for byte operations. | 691 // We cheat a little and use GPRRegister even for byte operations. |
687 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = | 692 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
688 VarCanBeByte | 693 VarCanBeByte |
689 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) | 694 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) |
690 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); | 695 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
691 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 696 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
692 if (SrcVar->hasReg()) { | 697 if (SrcVar->hasReg()) { |
693 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = | 698 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
694 SrcCanBeByte | 699 SrcCanBeByte |
695 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) | 700 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) |
696 : InstX86Base<Machine>::Traits::getEncodedGPR( | 701 : InstX86Base<Machine>::Traits::getEncodedGPR( |
697 SrcVar->getRegNum()); | 702 SrcVar->getRegNum()); |
698 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); | 703 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); |
699 } else { | 704 } else { |
700 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 705 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
701 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 706 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
702 Func->getTarget()) | 707 Target) |
703 ->stackVarToAsmOperand(SrcVar); | 708 ->stackVarToAsmOperand(SrcVar); |
704 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); | 709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); |
705 } | 710 } |
706 } else if (const auto *Mem = llvm::dyn_cast< | 711 } else if (const auto *Mem = llvm::dyn_cast< |
707 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 712 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
708 Mem->emitSegmentOverride(Asm); | 713 Mem->emitSegmentOverride(Asm); |
709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 714 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
710 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 715 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
711 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); | 716 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); |
712 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { | 717 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
713 AssemblerFixup *Fixup = | 718 AssemblerFixup *Fixup = |
714 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); | 719 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); |
715 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); | 720 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); |
716 } else if (const auto *Split = llvm::dyn_cast< | 721 } else if (const auto *Split = llvm::dyn_cast< |
717 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { | 722 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { |
718 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); | 723 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); |
719 } else { | 724 } else { |
(...skipping 25 matching lines...) Expand all Loading... |
745 } else { | 750 } else { |
746 llvm_unreachable("Unexpected operand type"); | 751 llvm_unreachable("Unexpected operand type"); |
747 } | 752 } |
748 } | 753 } |
749 | 754 |
750 template <class Machine> | 755 template <class Machine> |
751 void emitIASAsAddrOpTyGPR( | 756 void emitIASAsAddrOpTyGPR( |
752 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, | 757 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, |
753 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp | 758 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp |
754 &Emitter) { | 759 &Emitter) { |
| 760 TargetLowering *Target = Func->getTarget(); |
755 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { | 761 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { |
756 assert(!Op0Var->hasReg()); | 762 assert(!Op0Var->hasReg()); |
757 typename InstX86Base<Machine>::Traits::Address StackAddr( | 763 typename InstX86Base<Machine>::Traits::Address StackAddr( |
758 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 764 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
759 Func->getTarget()) | 765 Target) |
760 ->stackVarToAsmOperand(Op0Var)); | 766 ->stackVarToAsmOperand(Op0Var)); |
761 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); | 767 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); |
762 } else if (const auto *Op0Mem = llvm::dyn_cast< | 768 } else if (const auto *Op0Mem = llvm::dyn_cast< |
763 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { | 769 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { |
764 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 770 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
765 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 771 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
766 Op0Mem->emitSegmentOverride(Asm); | 772 Op0Mem->emitSegmentOverride(Asm); |
767 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm), Op1, | 773 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm, Target), |
768 Emitter); | 774 Op1, Emitter); |
769 } else if (const auto *Split = llvm::dyn_cast< | 775 } else if (const auto *Split = llvm::dyn_cast< |
770 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { | 776 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { |
771 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, | 777 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, |
772 Emitter); | 778 Emitter); |
773 } else { | 779 } else { |
774 llvm_unreachable("Unexpected operand type"); | 780 llvm_unreachable("Unexpected operand type"); |
775 } | 781 } |
776 } | 782 } |
777 | 783 |
778 template <class Machine> | 784 template <class Machine> |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); | 834 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); |
829 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); | 835 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); |
830 } | 836 } |
831 } | 837 } |
832 | 838 |
833 template <class Machine> | 839 template <class Machine> |
834 void emitIASXmmShift( | 840 void emitIASXmmShift( |
835 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 841 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
836 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp | 842 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp |
837 &Emitter) { | 843 &Emitter) { |
| 844 TargetLowering *Target = Func->getTarget(); |
838 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 845 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
839 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 846 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
840 assert(Var->hasReg()); | 847 assert(Var->hasReg()); |
841 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = | 848 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
842 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); | 849 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
843 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 850 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
844 if (SrcVar->hasReg()) { | 851 if (SrcVar->hasReg()) { |
845 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 852 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
846 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 853 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
847 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); | 854 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
848 } else { | 855 } else { |
849 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 856 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
850 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 857 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
851 Func->getTarget()) | 858 Target) |
852 ->stackVarToAsmOperand(SrcVar); | 859 ->stackVarToAsmOperand(SrcVar); |
853 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 860 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
854 } | 861 } |
855 } else if (const auto *Mem = llvm::dyn_cast< | 862 } else if (const auto *Mem = llvm::dyn_cast< |
856 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 863 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
857 assert(Mem->getSegmentRegister() == | 864 assert(Mem->getSegmentRegister() == |
858 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 865 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
859 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 866 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
860 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 867 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
861 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); | 868 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); |
862 } else { | 869 } else { |
863 llvm_unreachable("Unexpected operand type"); | 870 llvm_unreachable("Unexpected operand type"); |
864 } | 871 } |
865 } | 872 } |
866 | 873 |
867 template <class Machine> | 874 template <class Machine> |
868 void emitIASRegOpTyXMM( | 875 void emitIASRegOpTyXMM( |
869 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 876 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
870 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 877 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
871 &Emitter) { | 878 &Emitter) { |
| 879 TargetLowering *Target = Func->getTarget(); |
872 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 880 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
873 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 881 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
874 assert(Var->hasReg()); | 882 assert(Var->hasReg()); |
875 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = | 883 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
876 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); | 884 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
877 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 885 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
878 if (SrcVar->hasReg()) { | 886 if (SrcVar->hasReg()) { |
879 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 887 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
880 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 888 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
881 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); | 889 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
882 } else { | 890 } else { |
883 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 891 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
884 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 892 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
885 Func->getTarget()) | 893 Target) |
886 ->stackVarToAsmOperand(SrcVar); | 894 ->stackVarToAsmOperand(SrcVar); |
887 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 895 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
888 } | 896 } |
889 } else if (const auto *Mem = llvm::dyn_cast< | 897 } else if (const auto *Mem = llvm::dyn_cast< |
890 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 898 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
891 assert(Mem->getSegmentRegister() == | 899 assert(Mem->getSegmentRegister() == |
892 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 900 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
893 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 901 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
894 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 902 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
895 (Asm->*(Emitter.XmmAddr))( | 903 (Asm->*(Emitter.XmmAddr))( |
896 Ty, VarReg, | 904 Ty, VarReg, |
897 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 905 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
898 } else { | 906 } else { |
899 llvm_unreachable("Unexpected operand type"); | 907 llvm_unreachable("Unexpected operand type"); |
900 } | 908 } |
901 } | 909 } |
902 | 910 |
903 template <class Machine, typename DReg_t, typename SReg_t, | 911 template <class Machine, typename DReg_t, typename SReg_t, |
904 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> | 912 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> |
905 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, | 913 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, |
906 Type SrcTy, const Operand *Src, | 914 Type SrcTy, const Operand *Src, |
907 const typename InstX86Base<Machine>::Traits::Assembler:: | 915 const typename InstX86Base<Machine>::Traits::Assembler:: |
908 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) { | 916 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) { |
| 917 TargetLowering *Target = Func->getTarget(); |
909 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 918 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
910 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 919 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
911 assert(Dest->hasReg()); | 920 assert(Dest->hasReg()); |
912 DReg_t DestReg = destEnc(Dest->getRegNum()); | 921 DReg_t DestReg = destEnc(Dest->getRegNum()); |
913 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 922 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
914 if (SrcVar->hasReg()) { | 923 if (SrcVar->hasReg()) { |
915 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); | 924 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
916 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); | 925 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); |
917 } else { | 926 } else { |
918 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 927 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
919 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 928 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
920 Func->getTarget()) | 929 Target) |
921 ->stackVarToAsmOperand(SrcVar); | 930 ->stackVarToAsmOperand(SrcVar); |
922 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); | 931 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); |
923 } | 932 } |
924 } else if (const auto *Mem = llvm::dyn_cast< | 933 } else if (const auto *Mem = llvm::dyn_cast< |
925 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 934 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
926 Mem->emitSegmentOverride(Asm); | 935 Mem->emitSegmentOverride(Asm); |
927 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, Mem->toAsmAddress(Asm)); | 936 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, |
| 937 Mem->toAsmAddress(Asm, Target)); |
928 } else { | 938 } else { |
929 llvm_unreachable("Unexpected operand type"); | 939 llvm_unreachable("Unexpected operand type"); |
930 } | 940 } |
931 } | 941 } |
932 | 942 |
933 template <class Machine, typename DReg_t, typename SReg_t, | 943 template <class Machine, typename DReg_t, typename SReg_t, |
934 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> | 944 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> |
935 void emitIASThreeOpImmOps( | 945 void emitIASThreeOpImmOps( |
936 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, | 946 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, |
937 const Operand *Src1, | 947 const Operand *Src1, |
938 const typename InstX86Base<Machine>::Traits::Assembler:: | 948 const typename InstX86Base<Machine>::Traits::Assembler:: |
939 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) { | 949 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) { |
| 950 TargetLowering *Target = Func->getTarget(); |
940 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 951 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
941 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 952 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
942 // This only handles Dest being a register, and Src1 being an immediate. | 953 // This only handles Dest being a register, and Src1 being an immediate. |
943 assert(Dest->hasReg()); | 954 assert(Dest->hasReg()); |
944 DReg_t DestReg = destEnc(Dest->getRegNum()); | 955 DReg_t DestReg = destEnc(Dest->getRegNum()); |
945 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); | 956 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); |
946 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { | 957 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { |
947 if (SrcVar->hasReg()) { | 958 if (SrcVar->hasReg()) { |
948 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); | 959 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
949 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); | 960 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); |
950 } else { | 961 } else { |
951 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 962 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
952 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 963 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
953 Func->getTarget()) | 964 Target) |
954 ->stackVarToAsmOperand(SrcVar); | 965 ->stackVarToAsmOperand(SrcVar); |
955 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); | 966 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); |
956 } | 967 } |
957 } else if (const auto *Mem = llvm::dyn_cast< | 968 } else if (const auto *Mem = llvm::dyn_cast< |
958 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { | 969 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { |
959 Mem->emitSegmentOverride(Asm); | 970 Mem->emitSegmentOverride(Asm); |
960 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, Mem->toAsmAddress(Asm), | 971 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, |
961 Imm); | 972 Mem->toAsmAddress(Asm, Target), Imm); |
962 } else { | 973 } else { |
963 llvm_unreachable("Unexpected operand type"); | 974 llvm_unreachable("Unexpected operand type"); |
964 } | 975 } |
965 } | 976 } |
966 | 977 |
967 template <class Machine> | 978 template <class Machine> |
968 void emitIASMovlikeXMM( | 979 void emitIASMovlikeXMM( |
969 const Cfg *Func, const Variable *Dest, const Operand *Src, | 980 const Cfg *Func, const Variable *Dest, const Operand *Src, |
970 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps | 981 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps |
971 Emitter) { | 982 Emitter) { |
| 983 TargetLowering *Target = Func->getTarget(); |
972 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 984 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
973 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 985 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
974 if (Dest->hasReg()) { | 986 if (Dest->hasReg()) { |
975 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = | 987 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
976 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); | 988 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
977 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 989 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
978 if (SrcVar->hasReg()) { | 990 if (SrcVar->hasReg()) { |
979 (Asm->*(Emitter.XmmXmm))( | 991 (Asm->*(Emitter.XmmXmm))( |
980 DestReg, | 992 DestReg, |
981 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 993 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
982 } else { | 994 } else { |
983 typename InstX86Base<Machine>::Traits::Address StackAddr( | 995 typename InstX86Base<Machine>::Traits::Address StackAddr( |
984 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering | 996 static_cast< |
985 *>(Func->getTarget()) | 997 typename InstX86Base<Machine>::Traits::TargetLowering *>(Target) |
986 ->stackVarToAsmOperand(SrcVar)); | 998 ->stackVarToAsmOperand(SrcVar)); |
987 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); | 999 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); |
988 } | 1000 } |
989 } else if (const auto *SrcMem = llvm::dyn_cast< | 1001 } else if (const auto *SrcMem = llvm::dyn_cast< |
990 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 1002 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
991 assert(SrcMem->getSegmentRegister() == | 1003 assert(SrcMem->getSegmentRegister() == |
992 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1004 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
993 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm)); | 1005 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm, Target)); |
994 } else { | 1006 } else { |
995 llvm_unreachable("Unexpected operand type"); | 1007 llvm_unreachable("Unexpected operand type"); |
996 } | 1008 } |
997 } else { | 1009 } else { |
998 typename InstX86Base<Machine>::Traits::Address StackAddr( | 1010 typename InstX86Base<Machine>::Traits::Address StackAddr( |
999 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1011 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1000 Func->getTarget()) | 1012 Target) |
1001 ->stackVarToAsmOperand(Dest)); | 1013 ->stackVarToAsmOperand(Dest)); |
1002 // Src must be a register in this case. | 1014 // Src must be a register in this case. |
1003 const auto *SrcVar = llvm::cast<Variable>(Src); | 1015 const auto *SrcVar = llvm::cast<Variable>(Src); |
1004 assert(SrcVar->hasReg()); | 1016 assert(SrcVar->hasReg()); |
1005 (Asm->*(Emitter.AddrXmm))( | 1017 (Asm->*(Emitter.AddrXmm))( |
1006 StackAddr, | 1018 StackAddr, |
1007 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 1019 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
1008 } | 1020 } |
1009 } | 1021 } |
1010 | 1022 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 this->emitTwoAddress(buf, this, Func); | 1059 this->emitTwoAddress(buf, this, Func); |
1048 } | 1060 } |
1049 | 1061 |
1050 template <class Machine> | 1062 template <class Machine> |
1051 void InstX86Pmull<Machine>::emit(const Cfg *Func) const { | 1063 void InstX86Pmull<Machine>::emit(const Cfg *Func) const { |
1052 if (!BuildDefs::dump()) | 1064 if (!BuildDefs::dump()) |
1053 return; | 1065 return; |
1054 char buf[30]; | 1066 char buf[30]; |
1055 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || | 1067 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || |
1056 this->getDest()->getType() == IceType_v8i16; | 1068 this->getDest()->getType() == IceType_v8i16; |
| 1069 TargetLowering *Target = Func->getTarget(); |
1057 bool InstructionSetIsValid = | 1070 bool InstructionSetIsValid = |
1058 this->getDest()->getType() == IceType_v8i16 || | 1071 this->getDest()->getType() == IceType_v8i16 || |
1059 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1072 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1060 Func->getTarget()) | 1073 Target) |
1061 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; | 1074 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
1062 (void)TypesAreValid; | 1075 (void)TypesAreValid; |
1063 (void)InstructionSetIsValid; | 1076 (void)InstructionSetIsValid; |
1064 assert(TypesAreValid); | 1077 assert(TypesAreValid); |
1065 assert(InstructionSetIsValid); | 1078 assert(InstructionSetIsValid); |
1066 snprintf( | 1079 snprintf( |
1067 buf, llvm::array_lengthof(buf), "pmull%s", | 1080 buf, llvm::array_lengthof(buf), "pmull%s", |
1068 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] | 1081 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
1069 .PackString); | 1082 .PackString); |
1070 this->emitTwoAddress(buf, this, Func); | 1083 this->emitTwoAddress(buf, this, Func); |
1071 } | 1084 } |
1072 | 1085 |
1073 template <class Machine> | 1086 template <class Machine> |
1074 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { | 1087 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { |
1075 Type Ty = this->getDest()->getType(); | 1088 Type Ty = this->getDest()->getType(); |
1076 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; | 1089 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; |
| 1090 TargetLowering *Target = Func->getTarget(); |
1077 bool InstructionSetIsValid = | 1091 bool InstructionSetIsValid = |
1078 Ty == IceType_v8i16 || | 1092 Ty == IceType_v8i16 || |
1079 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1093 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1080 Func->getTarget()) | 1094 Target) |
1081 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; | 1095 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
1082 (void)TypesAreValid; | 1096 (void)TypesAreValid; |
1083 (void)InstructionSetIsValid; | 1097 (void)InstructionSetIsValid; |
1084 assert(TypesAreValid); | 1098 assert(TypesAreValid); |
1085 assert(InstructionSetIsValid); | 1099 assert(InstructionSetIsValid); |
1086 assert(this->getSrcSize() == 2); | 1100 assert(this->getSrcSize() == 2); |
1087 Type ElementTy = typeElementType(Ty); | 1101 Type ElementTy = typeElementType(Ty); |
1088 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), | 1102 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), |
1089 this->Emitter); | 1103 this->Emitter); |
1090 } | 1104 } |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1215 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0); | 1229 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0); |
1216 const Variable *Dest = Inst->getDest(); | 1230 const Variable *Dest = Inst->getDest(); |
1217 const Operand *Src = Inst->getSrc(1); | 1231 const Operand *Src = Inst->getSrc(1); |
1218 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter); | 1232 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter); |
1219 } | 1233 } |
1220 | 1234 |
1221 template <class Machine> | 1235 template <class Machine> |
1222 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { | 1236 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { |
1223 if (!BuildDefs::dump()) | 1237 if (!BuildDefs::dump()) |
1224 return; | 1238 return; |
| 1239 TargetLowering *Target = Func->getTarget(); |
1225 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1240 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1226 Func->getTarget()) | 1241 Target) |
1227 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 1242 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1228 emitVariableBlendInst<Machine>(this->Opcode, this, Func); | 1243 emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
1229 } | 1244 } |
1230 | 1245 |
1231 template <class Machine> | 1246 template <class Machine> |
1232 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { | 1247 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { |
| 1248 TargetLowering *Target = Func->getTarget(); |
1233 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1249 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1234 Func->getTarget()) | 1250 Target) |
1235 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 1251 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1236 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 1252 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
1237 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, | 1253 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, |
1238 &InstX86Base<Machine>::Traits::Assembler::blendvps}; | 1254 &InstX86Base<Machine>::Traits::Assembler::blendvps}; |
1239 emitIASVariableBlendInst<Machine>(this, Func, Emitter); | 1255 emitIASVariableBlendInst<Machine>(this, Func, Emitter); |
1240 } | 1256 } |
1241 | 1257 |
1242 template <class Machine> | 1258 template <class Machine> |
1243 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { | 1259 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { |
1244 if (!BuildDefs::dump()) | 1260 if (!BuildDefs::dump()) |
1245 return; | 1261 return; |
| 1262 TargetLowering *Target = Func->getTarget(); |
1246 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1263 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1247 Func->getTarget()) | 1264 Target) |
1248 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 1265 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1249 emitVariableBlendInst<Machine>(this->Opcode, this, Func); | 1266 emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
1250 } | 1267 } |
1251 | 1268 |
1252 template <class Machine> | 1269 template <class Machine> |
1253 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { | 1270 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { |
| 1271 TargetLowering *Target = Func->getTarget(); |
1254 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1272 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1255 Func->getTarget()) | 1273 Target) |
1256 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 1274 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1257 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 1275 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
1258 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, | 1276 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, |
1259 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; | 1277 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; |
1260 emitIASVariableBlendInst<Machine>(this, Func, Emitter); | 1278 emitIASVariableBlendInst<Machine>(this, Func, Emitter); |
1261 } | 1279 } |
1262 | 1280 |
1263 template <class Machine> | 1281 template <class Machine> |
1264 void InstX86Imul<Machine>::emit(const Cfg *Func) const { | 1282 void InstX86Imul<Machine>::emit(const Cfg *Func) const { |
1265 if (!BuildDefs::dump()) | 1283 if (!BuildDefs::dump()) |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 1368 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
1351 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 1369 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
1352 InstX86Base<Machine>::Traits::getEncodedGPR, | 1370 InstX86Base<Machine>::Traits::getEncodedGPR, |
1353 InstX86Base<Machine>::Traits::getEncodedGPR>( | 1371 InstX86Base<Machine>::Traits::getEncodedGPR>( |
1354 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); | 1372 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
1355 } | 1373 } |
1356 | 1374 |
1357 template <class Machine> | 1375 template <class Machine> |
1358 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { | 1376 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { |
1359 assert(this->getSrcSize() == 3); | 1377 assert(this->getSrcSize() == 3); |
| 1378 TargetLowering *Target = Func->getTarget(); |
1360 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1379 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1361 Func->getTarget()) | 1380 Target) |
1362 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 1381 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1363 const Variable *Dest = this->getDest(); | 1382 const Variable *Dest = this->getDest(); |
1364 assert(Dest == this->getSrc(0)); | 1383 assert(Dest == this->getSrc(0)); |
1365 Type Ty = Dest->getType(); | 1384 Type Ty = Dest->getType(); |
1366 static const typename InstX86Base<Machine>::Traits::Assembler:: | 1385 static const typename InstX86Base<Machine>::Traits::Assembler:: |
1367 template ThreeOpImmEmitter< | 1386 template ThreeOpImmEmitter< |
1368 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, | 1387 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
1369 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> | 1388 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> |
1370 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, | 1389 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, |
1371 &InstX86Base<Machine>::Traits::Assembler::insertps}; | 1390 &InstX86Base<Machine>::Traits::Assembler::insertps}; |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1598 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { | 1617 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { |
1599 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); | 1618 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); |
1600 assert(this->getDest()->hasReg()); | 1619 assert(this->getDest()->hasReg()); |
1601 assert(this->getSrcSize() == 2); | 1620 assert(this->getSrcSize() == 2); |
1602 Operand *Src = this->getSrc(1); | 1621 Operand *Src = this->getSrc(1); |
1603 Type SrcTy = Src->getType(); | 1622 Type SrcTy = Src->getType(); |
1604 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || | 1623 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || |
1605 (InstX86Base<Machine>::Traits::Is64Bit)); | 1624 (InstX86Base<Machine>::Traits::Is64Bit)); |
1606 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1625 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1607 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1626 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 1627 TargetLowering *Target = Func->getTarget(); |
1608 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 1628 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
1609 if (SrcVar->hasReg()) { | 1629 if (SrcVar->hasReg()) { |
1610 Asm->cmov( | 1630 Asm->cmov( |
1611 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1631 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1612 this->getDest()->getRegNum()), | 1632 this->getDest()->getRegNum()), |
1613 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); | 1633 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
1614 } else { | 1634 } else { |
1615 Asm->cmov( | 1635 Asm->cmov( |
1616 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1636 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1617 this->getDest()->getRegNum()), | 1637 this->getDest()->getRegNum()), |
1618 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1638 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1619 Func->getTarget()) | 1639 Target) |
1620 ->stackVarToAsmOperand(SrcVar)); | 1640 ->stackVarToAsmOperand(SrcVar)); |
1621 } | 1641 } |
1622 } else if (const auto *Mem = llvm::dyn_cast< | 1642 } else if (const auto *Mem = llvm::dyn_cast< |
1623 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 1643 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
1624 assert(Mem->getSegmentRegister() == | 1644 assert(Mem->getSegmentRegister() == |
1625 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1645 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1626 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1646 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1627 this->getDest()->getRegNum()), | 1647 this->getDest()->getRegNum()), |
1628 Mem->toAsmAddress(Asm)); | 1648 Mem->toAsmAddress(Asm, Target)); |
1629 } else { | 1649 } else { |
1630 llvm_unreachable("Unexpected operand type"); | 1650 llvm_unreachable("Unexpected operand type"); |
1631 } | 1651 } |
1632 } | 1652 } |
1633 | 1653 |
1634 template <class Machine> | 1654 template <class Machine> |
1635 void InstX86Cmov<Machine>::dump(const Cfg *Func) const { | 1655 void InstX86Cmov<Machine>::dump(const Cfg *Func) const { |
1636 if (!BuildDefs::dump()) | 1656 if (!BuildDefs::dump()) |
1637 return; | 1657 return; |
1638 Ostream &Str = Func->getContext()->getStrDump(); | 1658 Ostream &Str = Func->getContext()->getStrDump(); |
(...skipping 25 matching lines...) Expand all Loading... |
1664 | 1684 |
1665 template <class Machine> | 1685 template <class Machine> |
1666 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { | 1686 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { |
1667 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1687 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1668 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1688 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1669 assert(this->getSrcSize() == 2); | 1689 assert(this->getSrcSize() == 2); |
1670 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); | 1690 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); |
1671 // Assuming there isn't any load folding for cmpps, and vector constants are | 1691 // Assuming there isn't any load folding for cmpps, and vector constants are |
1672 // not allowed in PNaCl. | 1692 // not allowed in PNaCl. |
1673 assert(llvm::isa<Variable>(this->getSrc(1))); | 1693 assert(llvm::isa<Variable>(this->getSrc(1))); |
| 1694 TargetLowering *Target = Func->getTarget(); |
1674 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); | 1695 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
1675 if (SrcVar->hasReg()) { | 1696 if (SrcVar->hasReg()) { |
1676 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( | 1697 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
1677 this->getDest()->getRegNum()), | 1698 this->getDest()->getRegNum()), |
1678 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), | 1699 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), |
1679 Condition); | 1700 Condition); |
1680 } else { | 1701 } else { |
1681 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 1702 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
1682 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1703 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1683 Func->getTarget()) | 1704 Target) |
1684 ->stackVarToAsmOperand(SrcVar); | 1705 ->stackVarToAsmOperand(SrcVar); |
1685 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( | 1706 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
1686 this->getDest()->getRegNum()), | 1707 this->getDest()->getRegNum()), |
1687 SrcStackAddr, Condition); | 1708 SrcStackAddr, Condition); |
1688 } | 1709 } |
1689 } | 1710 } |
1690 | 1711 |
1691 template <class Machine> | 1712 template <class Machine> |
1692 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { | 1713 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { |
1693 if (!BuildDefs::dump()) | 1714 if (!BuildDefs::dump()) |
(...skipping 23 matching lines...) Expand all Loading... |
1717 Str << ", "; | 1738 Str << ", "; |
1718 this->getSrc(0)->emit(Func); | 1739 this->getSrc(0)->emit(Func); |
1719 } | 1740 } |
1720 | 1741 |
1721 template <class Machine> | 1742 template <class Machine> |
1722 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { | 1743 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { |
1723 assert(this->getSrcSize() == 3); | 1744 assert(this->getSrcSize() == 3); |
1724 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1745 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1725 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1746 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1726 Type Ty = this->getSrc(0)->getType(); | 1747 Type Ty = this->getSrc(0)->getType(); |
| 1748 TargetLowering *Target = Func->getTarget(); |
1727 const auto Mem = | 1749 const auto Mem = |
1728 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1750 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1729 this->getSrc(0)); | 1751 this->getSrc(0)); |
1730 assert(Mem->getSegmentRegister() == | 1752 assert(Mem->getSegmentRegister() == |
1731 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1753 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1732 const typename InstX86Base<Machine>::Traits::Address Addr = | 1754 const typename InstX86Base<Machine>::Traits::Address Addr = |
1733 Mem->toAsmAddress(Asm); | 1755 Mem->toAsmAddress(Asm, Target); |
1734 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); | 1756 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); |
1735 assert(VarReg->hasReg()); | 1757 assert(VarReg->hasReg()); |
1736 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 1758 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
1737 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); | 1759 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
1738 Asm->cmpxchg(Ty, Addr, Reg, this->Locked); | 1760 Asm->cmpxchg(Ty, Addr, Reg, this->Locked); |
1739 } | 1761 } |
1740 | 1762 |
1741 template <class Machine> | 1763 template <class Machine> |
1742 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const { | 1764 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const { |
1743 if (!BuildDefs::dump()) | 1765 if (!BuildDefs::dump()) |
(...skipping 22 matching lines...) Expand all Loading... |
1766 template <class Machine> | 1788 template <class Machine> |
1767 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { | 1789 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { |
1768 assert(this->getSrcSize() == 5); | 1790 assert(this->getSrcSize() == 5); |
1769 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1791 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1770 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1792 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1771 const auto Mem = | 1793 const auto Mem = |
1772 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1794 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1773 this->getSrc(0)); | 1795 this->getSrc(0)); |
1774 assert(Mem->getSegmentRegister() == | 1796 assert(Mem->getSegmentRegister() == |
1775 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1797 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
| 1798 TargetLowering *Target = Func->getTarget(); |
1776 const typename InstX86Base<Machine>::Traits::Address Addr = | 1799 const typename InstX86Base<Machine>::Traits::Address Addr = |
1777 Mem->toAsmAddress(Asm); | 1800 Mem->toAsmAddress(Asm, Target); |
1778 Asm->cmpxchg8b(Addr, this->Locked); | 1801 Asm->cmpxchg8b(Addr, this->Locked); |
1779 } | 1802 } |
1780 | 1803 |
1781 template <class Machine> | 1804 template <class Machine> |
1782 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { | 1805 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { |
1783 if (!BuildDefs::dump()) | 1806 if (!BuildDefs::dump()) |
1784 return; | 1807 return; |
1785 Ostream &Str = Func->getContext()->getStrDump(); | 1808 Ostream &Str = Func->getContext()->getStrDump(); |
1786 if (this->Locked) { | 1809 if (this->Locked) { |
1787 Str << "lock "; | 1810 Str << "lock "; |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2107 const Operand *Src = this->getSrc(0); | 2130 const Operand *Src = this->getSrc(0); |
2108 Type DestTy = Dest->getType(); | 2131 Type DestTy = Dest->getType(); |
2109 if (isScalarFloatingType(DestTy)) { | 2132 if (isScalarFloatingType(DestTy)) { |
2110 // Src must be a register, since Dest is a Mem operand of some kind. | 2133 // Src must be a register, since Dest is a Mem operand of some kind. |
2111 const auto *SrcVar = llvm::cast<Variable>(Src); | 2134 const auto *SrcVar = llvm::cast<Variable>(Src); |
2112 assert(SrcVar->hasReg()); | 2135 assert(SrcVar->hasReg()); |
2113 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 2136 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
2114 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 2137 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
2115 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2138 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2116 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 2140 TargetLowering *Target = Func->getTarget(); |
2117 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { | 2141 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { |
2118 assert(!DestVar->hasReg()); | 2142 assert(!DestVar->hasReg()); |
2119 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2143 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2120 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2144 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2121 Func->getTarget()) | 2145 Target) |
2122 ->stackVarToAsmOperand(DestVar)); | 2146 ->stackVarToAsmOperand(DestVar)); |
2123 Asm->movss(DestTy, StackAddr, SrcReg); | 2147 Asm->movss(DestTy, StackAddr, SrcReg); |
2124 } else { | 2148 } else { |
2125 const auto DestMem = | 2149 const auto DestMem = |
2126 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2150 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2127 Dest); | 2151 Dest); |
2128 assert(DestMem->getSegmentRegister() == | 2152 assert(DestMem->getSegmentRegister() == |
2129 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2153 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2130 Asm->movss(DestTy, DestMem->toAsmAddress(Asm), SrcReg); | 2154 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg); |
2131 } | 2155 } |
2132 return; | 2156 return; |
2133 } else { | 2157 } else { |
2134 assert(isScalarIntegerType(DestTy)); | 2158 assert(isScalarIntegerType(DestTy)); |
2135 static const typename InstX86Base< | 2159 static const typename InstX86Base< |
2136 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { | 2160 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { |
2137 &InstX86Base<Machine>::Traits::Assembler::mov, | 2161 &InstX86Base<Machine>::Traits::Assembler::mov, |
2138 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2162 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2139 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter); | 2163 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter); |
2140 } | 2164 } |
(...skipping 28 matching lines...) Expand all Loading... |
2169 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2193 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2170 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2194 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2171 assert(this->getSrcSize() == 2); | 2195 assert(this->getSrcSize() == 2); |
2172 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2196 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2173 const auto DestMem = | 2197 const auto DestMem = |
2174 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2198 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2175 this->getSrc(1)); | 2199 this->getSrc(1)); |
2176 assert(DestMem->getSegmentRegister() == | 2200 assert(DestMem->getSegmentRegister() == |
2177 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2201 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2178 assert(SrcVar->hasReg()); | 2202 assert(SrcVar->hasReg()); |
2179 Asm->movups(DestMem->toAsmAddress(Asm), | 2203 TargetLowering *Target = Func->getTarget(); |
| 2204 Asm->movups(DestMem->toAsmAddress(Asm, Target), |
2180 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2205 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2181 } | 2206 } |
2182 | 2207 |
2183 template <class Machine> | 2208 template <class Machine> |
2184 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { | 2209 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { |
2185 if (!BuildDefs::dump()) | 2210 if (!BuildDefs::dump()) |
2186 return; | 2211 return; |
2187 Ostream &Str = Func->getContext()->getStrDump(); | 2212 Ostream &Str = Func->getContext()->getStrDump(); |
2188 Str << "storep." << this->getSrc(0)->getType() << " "; | 2213 Str << "storep." << this->getSrc(0)->getType() << " "; |
2189 this->getSrc(1)->dump(Func); | 2214 this->getSrc(1)->dump(Func); |
(...skipping 21 matching lines...) Expand all Loading... |
2211 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2236 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2212 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2237 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2213 assert(this->getSrcSize() == 2); | 2238 assert(this->getSrcSize() == 2); |
2214 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2239 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2215 const auto DestMem = | 2240 const auto DestMem = |
2216 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2241 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2217 this->getSrc(1)); | 2242 this->getSrc(1)); |
2218 assert(DestMem->getSegmentRegister() == | 2243 assert(DestMem->getSegmentRegister() == |
2219 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2244 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2220 assert(SrcVar->hasReg()); | 2245 assert(SrcVar->hasReg()); |
2221 Asm->movq(DestMem->toAsmAddress(Asm), | 2246 TargetLowering *Target = Func->getTarget(); |
| 2247 Asm->movq(DestMem->toAsmAddress(Asm, Target), |
2222 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2248 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2223 } | 2249 } |
2224 | 2250 |
2225 template <class Machine> | 2251 template <class Machine> |
2226 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { | 2252 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { |
2227 if (!BuildDefs::dump()) | 2253 if (!BuildDefs::dump()) |
2228 return; | 2254 return; |
2229 Ostream &Str = Func->getContext()->getStrDump(); | 2255 Ostream &Str = Func->getContext()->getStrDump(); |
2230 Str << "storeq." << this->getSrc(0)->getType() << " "; | 2256 Str << "storeq." << this->getSrc(0)->getType() << " "; |
2231 this->getSrc(1)->dump(Func); | 2257 this->getSrc(1)->dump(Func); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2274 << (!isScalarFloatingType(DestTy) | 2300 << (!isScalarFloatingType(DestTy) |
2275 ? this->getWidthString(DestTy) | 2301 ? this->getWidthString(DestTy) |
2276 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] | 2302 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] |
2277 .SdSsString) << "\t"; | 2303 .SdSsString) << "\t"; |
2278 } | 2304 } |
2279 // For an integer truncation operation, src is wider than dest. In this case, | 2305 // For an integer truncation operation, src is wider than dest. In this case, |
2280 // we use a mov instruction whose data width matches the narrower dest. | 2306 // we use a mov instruction whose data width matches the narrower dest. |
2281 // TODO: This assert disallows usages such as copying a floating | 2307 // TODO: This assert disallows usages such as copying a floating |
2282 // point value between a vector and a scalar (which movss is used for). Clean | 2308 // point value between a vector and a scalar (which movss is used for). Clean |
2283 // this up. | 2309 // this up. |
2284 assert(Func->getTarget()->typeWidthInBytesOnStack(DestTy) == | 2310 TargetLowering *Target = Func->getTarget(); |
2285 Func->getTarget()->typeWidthInBytesOnStack(SrcTy)); | 2311 assert(Target->typeWidthInBytesOnStack(DestTy) == |
| 2312 Target->typeWidthInBytesOnStack(SrcTy)); |
2286 const Operand *NewSrc = Src; | 2313 const Operand *NewSrc = Src; |
2287 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 2314 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
2288 int32_t NewRegNum = Variable::NoRegister; | 2315 int32_t NewRegNum = Variable::NoRegister; |
2289 if (SrcVar->hasReg()) | 2316 if (SrcVar->hasReg()) |
2290 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( | 2317 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( |
2291 DestTy, SrcVar->getRegNum()); | 2318 DestTy, SrcVar->getRegNum()); |
2292 if (SrcTy != DestTy) | 2319 if (SrcTy != DestTy) |
2293 NewSrc = SrcVar->asType(DestTy, NewRegNum); | 2320 NewSrc = SrcVar->asType(DestTy, NewRegNum); |
2294 } | 2321 } |
2295 NewSrc->emit(Func); | 2322 NewSrc->emit(Func); |
(...skipping 23 matching lines...) Expand all Loading... |
2319 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2346 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2320 static const typename InstX86Base< | 2347 static const typename InstX86Base< |
2321 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { | 2348 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { |
2322 &InstX86Base<Machine>::Traits::Assembler::mov, | 2349 &InstX86Base<Machine>::Traits::Assembler::mov, |
2323 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2350 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2324 // For an integer truncation operation, src is wider than dest. In this case, | 2351 // For an integer truncation operation, src is wider than dest. In this case, |
2325 // we use a mov instruction whose data width matches the narrower dest. | 2352 // we use a mov instruction whose data width matches the narrower dest. |
2326 // TODO: This assert disallows usages such as copying a floating | 2353 // TODO: This assert disallows usages such as copying a floating |
2327 // point value between a vector and a scalar (which movss is used for). Clean | 2354 // point value between a vector and a scalar (which movss is used for). Clean |
2328 // this up. | 2355 // this up. |
2329 assert( | 2356 TargetLowering *Target = Func->getTarget(); |
2330 Func->getTarget()->typeWidthInBytesOnStack(this->getDest()->getType()) == | 2357 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) == |
2331 Func->getTarget()->typeWidthInBytesOnStack(Src->getType())); | 2358 Target->typeWidthInBytesOnStack(Src->getType())); |
2332 if (Dest->hasReg()) { | 2359 if (Dest->hasReg()) { |
2333 if (isScalarFloatingType(DestTy)) { | 2360 if (isScalarFloatingType(DestTy)) { |
2334 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); | 2361 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); |
2335 return; | 2362 return; |
2336 } else { | 2363 } else { |
2337 assert(isScalarIntegerType(DestTy)); | 2364 assert(isScalarIntegerType(DestTy)); |
2338 // Widen DestTy for truncation (see above note). We should only do this | 2365 // Widen DestTy for truncation (see above note). We should only do this |
2339 // when both Src and Dest are integer types. | 2366 // when both Src and Dest are integer types. |
2340 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 && | 2367 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 && |
2341 isIntegerConstant(Src)) { | 2368 isIntegerConstant(Src)) { |
(...skipping 13 matching lines...) Expand all Loading... |
2355 SrcTy = DestTy; | 2382 SrcTy = DestTy; |
2356 } | 2383 } |
2357 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); | 2384 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); |
2358 return; | 2385 return; |
2359 } | 2386 } |
2360 } else { | 2387 } else { |
2361 // Dest must be Stack and Src *could* be a register. Use Src's type to | 2388 // Dest must be Stack and Src *could* be a register. Use Src's type to |
2362 // decide on the emitters. | 2389 // decide on the emitters. |
2363 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2390 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2364 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2391 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2365 Func->getTarget()) | 2392 Target) |
2366 ->stackVarToAsmOperand(Dest)); | 2393 ->stackVarToAsmOperand(Dest)); |
2367 if (isScalarFloatingType(SrcTy)) { | 2394 if (isScalarFloatingType(SrcTy)) { |
2368 // Src must be a register. | 2395 // Src must be a register. |
2369 const auto *SrcVar = llvm::cast<Variable>(Src); | 2396 const auto *SrcVar = llvm::cast<Variable>(Src); |
2370 assert(SrcVar->hasReg()); | 2397 assert(SrcVar->hasReg()); |
2371 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2398 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2372 Func->getAssembler< | 2399 Func->getAssembler< |
2373 typename InstX86Base<Machine>::Traits::Assembler>(); | 2400 typename InstX86Base<Machine>::Traits::Assembler>(); |
2374 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( | 2401 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( |
2375 SrcVar->getRegNum())); | 2402 SrcVar->getRegNum())); |
2376 return; | 2403 return; |
2377 } else { | 2404 } else { |
2378 // Src can be a register or immediate. | 2405 // Src can be a register or immediate. |
2379 assert(isScalarIntegerType(SrcTy)); | 2406 assert(isScalarIntegerType(SrcTy)); |
2380 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); | 2407 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); |
2381 return; | 2408 return; |
2382 } | 2409 } |
2383 return; | 2410 return; |
2384 } | 2411 } |
2385 } | 2412 } |
2386 | 2413 |
2387 template <class Machine> | 2414 template <class Machine> |
2388 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { | 2415 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { |
2389 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2416 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2390 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2417 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2391 assert(this->getSrcSize() == 1); | 2418 assert(this->getSrcSize() == 1); |
2392 const Variable *Dest = this->getDest(); | 2419 const Variable *Dest = this->getDest(); |
2393 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2420 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
| 2421 TargetLowering *Target = Func->getTarget(); |
2394 // For insert/extract element (one of Src/Dest is an Xmm vector and the other | 2422 // For insert/extract element (one of Src/Dest is an Xmm vector and the other |
2395 // is an int type). | 2423 // is an int type). |
2396 if (SrcVar->getType() == IceType_i32 || | 2424 if (SrcVar->getType() == IceType_i32 || |
2397 (InstX86Base<Machine>::Traits::Is64Bit && | 2425 (InstX86Base<Machine>::Traits::Is64Bit && |
2398 SrcVar->getType() == IceType_i64)) { | 2426 SrcVar->getType() == IceType_i64)) { |
2399 assert(isVectorType(Dest->getType()) || | 2427 assert(isVectorType(Dest->getType()) || |
2400 (isScalarFloatingType(Dest->getType()) && | 2428 (isScalarFloatingType(Dest->getType()) && |
2401 typeWidthInBytes(SrcVar->getType()) == | 2429 typeWidthInBytes(SrcVar->getType()) == |
2402 typeWidthInBytes(Dest->getType()))); | 2430 typeWidthInBytes(Dest->getType()))); |
2403 assert(Dest->hasReg()); | 2431 assert(Dest->hasReg()); |
2404 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = | 2432 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
2405 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); | 2433 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
2406 if (SrcVar->hasReg()) { | 2434 if (SrcVar->hasReg()) { |
2407 Asm->movd( | 2435 Asm->movd( |
2408 SrcVar->getType(), DestReg, | 2436 SrcVar->getType(), DestReg, |
2409 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); | 2437 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
2410 } else { | 2438 } else { |
2411 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2439 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2412 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2440 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2413 Func->getTarget()) | 2441 Target) |
2414 ->stackVarToAsmOperand(SrcVar)); | 2442 ->stackVarToAsmOperand(SrcVar)); |
2415 Asm->movd(SrcVar->getType(), DestReg, StackAddr); | 2443 Asm->movd(SrcVar->getType(), DestReg, StackAddr); |
2416 } | 2444 } |
2417 } else { | 2445 } else { |
2418 assert(isVectorType(SrcVar->getType()) || | 2446 assert(isVectorType(SrcVar->getType()) || |
2419 (isScalarFloatingType(SrcVar->getType()) && | 2447 (isScalarFloatingType(SrcVar->getType()) && |
2420 typeWidthInBytes(SrcVar->getType()) == | 2448 typeWidthInBytes(SrcVar->getType()) == |
2421 typeWidthInBytes(Dest->getType()))); | 2449 typeWidthInBytes(Dest->getType()))); |
2422 assert(SrcVar->hasReg()); | 2450 assert(SrcVar->hasReg()); |
2423 assert(Dest->getType() == IceType_i32 || | 2451 assert(Dest->getType() == IceType_i32 || |
2424 (InstX86Base<Machine>::Traits::Is64Bit && | 2452 (InstX86Base<Machine>::Traits::Is64Bit && |
2425 Dest->getType() == IceType_i64)); | 2453 Dest->getType() == IceType_i64)); |
2426 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 2454 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
2427 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 2455 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
2428 if (Dest->hasReg()) { | 2456 if (Dest->hasReg()) { |
2429 Asm->movd(Dest->getType(), | 2457 Asm->movd(Dest->getType(), |
2430 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), | 2458 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), |
2431 SrcReg); | 2459 SrcReg); |
2432 } else { | 2460 } else { |
2433 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2461 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2434 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2462 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2435 Func->getTarget()) | 2463 Target) |
2436 ->stackVarToAsmOperand(Dest)); | 2464 ->stackVarToAsmOperand(Dest)); |
2437 Asm->movd(Dest->getType(), StackAddr, SrcReg); | 2465 Asm->movd(Dest->getType(), StackAddr, SrcReg); |
2438 } | 2466 } |
2439 } | 2467 } |
2440 } | 2468 } |
2441 | 2469 |
2442 template <class Machine> | 2470 template <class Machine> |
2443 void InstX86Movp<Machine>::emit(const Cfg *Func) const { | 2471 void InstX86Movp<Machine>::emit(const Cfg *Func) const { |
2444 if (!BuildDefs::dump()) | 2472 if (!BuildDefs::dump()) |
2445 return; | 2473 return; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2588 Str << "\tfld" << this->getFldString(Ty) << "\t"; | 2616 Str << "\tfld" << this->getFldString(Ty) << "\t"; |
2589 this->getSrc(0)->emit(Func); | 2617 this->getSrc(0)->emit(Func); |
2590 } | 2618 } |
2591 | 2619 |
2592 template <class Machine> | 2620 template <class Machine> |
2593 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { | 2621 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { |
2594 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2622 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2595 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2623 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2596 assert(this->getSrcSize() == 1); | 2624 assert(this->getSrcSize() == 1); |
2597 const Operand *Src = this->getSrc(0); | 2625 const Operand *Src = this->getSrc(0); |
| 2626 TargetLowering *Target = Func->getTarget(); |
2598 Type Ty = Src->getType(); | 2627 Type Ty = Src->getType(); |
2599 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { | 2628 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { |
2600 if (Var->hasReg()) { | 2629 if (Var->hasReg()) { |
2601 // This is a physical xmm register, so we need to spill it to a temporary | 2630 // This is a physical xmm register, so we need to spill it to a temporary |
2602 // stack slot. | 2631 // stack slot. |
2603 Immediate Width(typeWidthInBytes(Ty)); | 2632 Immediate Width(typeWidthInBytes(Ty)); |
2604 Asm->sub(IceType_i32, | 2633 Asm->sub(IceType_i32, |
2605 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2634 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
2606 Width); | 2635 Width); |
2607 typename InstX86Base<Machine>::Traits::Address StackSlot = | 2636 typename InstX86Base<Machine>::Traits::Address StackSlot = |
2608 typename InstX86Base<Machine>::Traits::Address( | 2637 typename InstX86Base<Machine>::Traits::Address( |
2609 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, | 2638 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, |
2610 AssemblerFixup::NoFixup); | 2639 AssemblerFixup::NoFixup); |
2611 Asm->movss(Ty, StackSlot, | 2640 Asm->movss(Ty, StackSlot, |
2612 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); | 2641 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); |
2613 Asm->fld(Ty, StackSlot); | 2642 Asm->fld(Ty, StackSlot); |
2614 Asm->add(IceType_i32, | 2643 Asm->add(IceType_i32, |
2615 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2644 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
2616 Width); | 2645 Width); |
2617 } else { | 2646 } else { |
2618 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2647 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2619 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2648 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2620 Func->getTarget()) | 2649 Target) |
2621 ->stackVarToAsmOperand(Var)); | 2650 ->stackVarToAsmOperand(Var)); |
2622 Asm->fld(Ty, StackAddr); | 2651 Asm->fld(Ty, StackAddr); |
2623 } | 2652 } |
2624 } else if (const auto *Mem = llvm::dyn_cast< | 2653 } else if (const auto *Mem = llvm::dyn_cast< |
2625 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 2654 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
2626 assert(Mem->getSegmentRegister() == | 2655 assert(Mem->getSegmentRegister() == |
2627 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2656 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2628 Asm->fld(Ty, Mem->toAsmAddress(Asm)); | 2657 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target)); |
2629 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 2658 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
2630 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 2659 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
2631 } else { | 2660 } else { |
2632 llvm_unreachable("Unexpected operand type"); | 2661 llvm_unreachable("Unexpected operand type"); |
2633 } | 2662 } |
2634 } | 2663 } |
2635 | 2664 |
2636 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const { | 2665 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const { |
2637 if (!BuildDefs::dump()) | 2666 if (!BuildDefs::dump()) |
2638 return; | 2667 return; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2681 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2710 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2682 assert(this->getSrcSize() == 0); | 2711 assert(this->getSrcSize() == 0); |
2683 const Variable *Dest = this->getDest(); | 2712 const Variable *Dest = this->getDest(); |
2684 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to | 2713 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to |
2685 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, | 2714 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, |
2686 // the fstp should be kept for the SideEffects of popping the stack. | 2715 // the fstp should be kept for the SideEffects of popping the stack. |
2687 if (!Dest) { | 2716 if (!Dest) { |
2688 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); | 2717 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); |
2689 return; | 2718 return; |
2690 } | 2719 } |
| 2720 TargetLowering *Target = Func->getTarget(); |
2691 Type Ty = Dest->getType(); | 2721 Type Ty = Dest->getType(); |
2692 if (!Dest->hasReg()) { | 2722 if (!Dest->hasReg()) { |
2693 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2723 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2694 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2724 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2695 Func->getTarget()) | 2725 Target) |
2696 ->stackVarToAsmOperand(Dest)); | 2726 ->stackVarToAsmOperand(Dest)); |
2697 Asm->fstp(Ty, StackAddr); | 2727 Asm->fstp(Ty, StackAddr); |
2698 } else { | 2728 } else { |
2699 // Dest is a physical (xmm) register, so st(0) needs to go through memory. | 2729 // Dest is a physical (xmm) register, so st(0) needs to go through memory. |
2700 // Hack this by creating a temporary stack slot, spilling st(0) there, | 2730 // Hack this by creating a temporary stack slot, spilling st(0) there, |
2701 // loading it into the xmm register, and deallocating the stack slot. | 2731 // loading it into the xmm register, and deallocating the stack slot. |
2702 Immediate Width(typeWidthInBytes(Ty)); | 2732 Immediate Width(typeWidthInBytes(Ty)); |
2703 Asm->sub(IceType_i32, | 2733 Asm->sub(IceType_i32, |
2704 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); | 2734 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); |
2705 typename InstX86Base<Machine>::Traits::Address StackSlot = | 2735 typename InstX86Base<Machine>::Traits::Address StackSlot = |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 this->emitTwoAddress(buf, this, Func); | 2778 this->emitTwoAddress(buf, this, Func); |
2749 } | 2779 } |
2750 | 2780 |
2751 template <class Machine> | 2781 template <class Machine> |
2752 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { | 2782 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { |
2753 if (!BuildDefs::dump()) | 2783 if (!BuildDefs::dump()) |
2754 return; | 2784 return; |
2755 Ostream &Str = Func->getContext()->getStrEmit(); | 2785 Ostream &Str = Func->getContext()->getStrEmit(); |
2756 assert(this->getSrcSize() == 2); | 2786 assert(this->getSrcSize() == 2); |
2757 // pextrb and pextrd are SSE4.1 instructions. | 2787 // pextrb and pextrd are SSE4.1 instructions. |
| 2788 TargetLowering *Target = Func->getTarget(); |
2758 assert(this->getSrc(0)->getType() == IceType_v8i16 || | 2789 assert(this->getSrc(0)->getType() == IceType_v8i16 || |
2759 this->getSrc(0)->getType() == IceType_v8i1 || | 2790 this->getSrc(0)->getType() == IceType_v8i1 || |
2760 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2791 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2761 Func->getTarget()) | 2792 Target) |
2762 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 2793 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2763 Str << "\t" << this->Opcode | 2794 Str << "\t" << this->Opcode |
2764 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) | 2795 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) |
2765 ->getType()] | 2796 ->getType()] |
2766 .PackString << "\t"; | 2797 .PackString << "\t"; |
2767 this->getSrc(1)->emit(Func); | 2798 this->getSrc(1)->emit(Func); |
2768 Str << ", "; | 2799 Str << ", "; |
2769 this->getSrc(0)->emit(Func); | 2800 this->getSrc(0)->emit(Func); |
2770 Str << ", "; | 2801 Str << ", "; |
2771 Variable *Dest = this->getDest(); | 2802 Variable *Dest = this->getDest(); |
2772 // pextrw must take a register dest. There is an SSE4.1 version that takes a | 2803 // pextrw must take a register dest. There is an SSE4.1 version that takes a |
2773 // memory dest, but we aren't using it. For uniformity, just restrict them | 2804 // memory dest, but we aren't using it. For uniformity, just restrict them |
2774 // all to have a register dest for now. | 2805 // all to have a register dest for now. |
2775 assert(Dest->hasReg()); | 2806 assert(Dest->hasReg()); |
2776 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); | 2807 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); |
2777 } | 2808 } |
2778 | 2809 |
2779 template <class Machine> | 2810 template <class Machine> |
2780 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { | 2811 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { |
2781 assert(this->getSrcSize() == 2); | 2812 assert(this->getSrcSize() == 2); |
2782 // pextrb and pextrd are SSE4.1 instructions. | 2813 // pextrb and pextrd are SSE4.1 instructions. |
2783 const Variable *Dest = this->getDest(); | 2814 const Variable *Dest = this->getDest(); |
2784 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( | 2815 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( |
2785 this->getSrc(0)->getType()); | 2816 this->getSrc(0)->getType()); |
| 2817 TargetLowering *Target = Func->getTarget(); |
2786 assert(DispatchTy == IceType_i16 || | 2818 assert(DispatchTy == IceType_i16 || |
2787 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2819 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2788 Func->getTarget()) | 2820 Target) |
2789 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 2821 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2790 // pextrw must take a register dest. There is an SSE4.1 version that takes a | 2822 // pextrw must take a register dest. There is an SSE4.1 version that takes a |
2791 // memory dest, but we aren't using it. For uniformity, just restrict them | 2823 // memory dest, but we aren't using it. For uniformity, just restrict them |
2792 // all to have a register dest for now. | 2824 // all to have a register dest for now. |
2793 assert(Dest->hasReg()); | 2825 assert(Dest->hasReg()); |
2794 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2). | 2826 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2). |
2795 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); | 2827 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); |
2796 static const typename InstX86Base<Machine>::Traits::Assembler:: | 2828 static const typename InstX86Base<Machine>::Traits::Assembler:: |
2797 template ThreeOpImmEmitter< | 2829 template ThreeOpImmEmitter< |
2798 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 2830 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
2799 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> | 2831 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> |
2800 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; | 2832 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; |
2801 emitIASThreeOpImmOps< | 2833 emitIASThreeOpImmOps< |
2802 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 2834 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
2803 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, | 2835 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
2804 InstX86Base<Machine>::Traits::getEncodedGPR, | 2836 InstX86Base<Machine>::Traits::getEncodedGPR, |
2805 InstX86Base<Machine>::Traits::getEncodedXmm>( | 2837 InstX86Base<Machine>::Traits::getEncodedXmm>( |
2806 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); | 2838 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
2807 } | 2839 } |
2808 | 2840 |
2809 template <class Machine> | 2841 template <class Machine> |
2810 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { | 2842 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { |
2811 if (!BuildDefs::dump()) | 2843 if (!BuildDefs::dump()) |
2812 return; | 2844 return; |
2813 Ostream &Str = Func->getContext()->getStrEmit(); | 2845 Ostream &Str = Func->getContext()->getStrEmit(); |
2814 assert(this->getSrcSize() == 3); | 2846 assert(this->getSrcSize() == 3); |
2815 // pinsrb and pinsrd are SSE4.1 instructions. | 2847 // pinsrb and pinsrd are SSE4.1 instructions. |
| 2848 TargetLowering *Target = Func->getTarget(); |
2816 assert(this->getDest()->getType() == IceType_v8i16 || | 2849 assert(this->getDest()->getType() == IceType_v8i16 || |
2817 this->getDest()->getType() == IceType_v8i1 || | 2850 this->getDest()->getType() == IceType_v8i1 || |
2818 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2851 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2819 Func->getTarget()) | 2852 Target) |
2820 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 2853 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2821 Str << "\t" << this->Opcode | 2854 Str << "\t" << this->Opcode |
2822 << InstX86Base< | 2855 << InstX86Base< |
2823 Machine>::Traits::TypeAttributes[this->getDest()->getType()] | 2856 Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
2824 .PackString << "\t"; | 2857 .PackString << "\t"; |
2825 this->getSrc(2)->emit(Func); | 2858 this->getSrc(2)->emit(Func); |
2826 Str << ", "; | 2859 Str << ", "; |
2827 Operand *Src1 = this->getSrc(1); | 2860 Operand *Src1 = this->getSrc(1); |
2828 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { | 2861 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { |
2829 // If src1 is a register, it should always be r32. | 2862 // If src1 is a register, it should always be r32. |
(...skipping 12 matching lines...) Expand all Loading... |
2842 this->getDest()->emit(Func); | 2875 this->getDest()->emit(Func); |
2843 } | 2876 } |
2844 | 2877 |
2845 template <class Machine> | 2878 template <class Machine> |
2846 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { | 2879 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { |
2847 assert(this->getSrcSize() == 3); | 2880 assert(this->getSrcSize() == 3); |
2848 assert(this->getDest() == this->getSrc(0)); | 2881 assert(this->getDest() == this->getSrc(0)); |
2849 // pinsrb and pinsrd are SSE4.1 instructions. | 2882 // pinsrb and pinsrd are SSE4.1 instructions. |
2850 const Operand *Src0 = this->getSrc(1); | 2883 const Operand *Src0 = this->getSrc(1); |
2851 Type DispatchTy = Src0->getType(); | 2884 Type DispatchTy = Src0->getType(); |
| 2885 TargetLowering *Target = Func->getTarget(); |
2852 assert(DispatchTy == IceType_i16 || | 2886 assert(DispatchTy == IceType_i16 || |
2853 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2887 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2854 Func->getTarget()) | 2888 Target) |
2855 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | 2889 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2856 // If src1 is a register, it should always be r32 (this should fall out from | 2890 // If src1 is a register, it should always be r32 (this should fall out from |
2857 // the encodings for ByteRegs overlapping the encodings for r32), but we have | 2891 // the encodings for ByteRegs overlapping the encodings for r32), but we have |
2858 // to make sure the register allocator didn't choose an 8-bit high register | 2892 // to make sure the register allocator didn't choose an 8-bit high register |
2859 // like "ah". | 2893 // like "ah". |
2860 if (BuildDefs::asserts()) { | 2894 if (BuildDefs::asserts()) { |
2861 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { | 2895 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { |
2862 if (Src0Var->hasReg()) { | 2896 if (Src0Var->hasReg()) { |
2863 int32_t RegNum = Src0Var->getRegNum(); | 2897 int32_t RegNum = Src0Var->getRegNum(); |
2864 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); | 2898 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2932 | 2966 |
2933 template <class Machine> | 2967 template <class Machine> |
2934 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { | 2968 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { |
2935 assert(this->getSrcSize() == 0); | 2969 assert(this->getSrcSize() == 0); |
2936 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2970 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2937 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2971 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2938 if (this->getDest()->hasReg()) { | 2972 if (this->getDest()->hasReg()) { |
2939 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( | 2973 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( |
2940 this->getDest()->getRegNum())); | 2974 this->getDest()->getRegNum())); |
2941 } else { | 2975 } else { |
| 2976 TargetLowering *Target = Func->getTarget(); |
2942 Asm->popl( | 2977 Asm->popl( |
2943 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2978 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2944 Func->getTarget()) | 2979 Target) |
2945 ->stackVarToAsmOperand(this->getDest())); | 2980 ->stackVarToAsmOperand(this->getDest())); |
2946 } | 2981 } |
2947 } | 2982 } |
2948 | 2983 |
2949 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { | 2984 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { |
2950 if (!BuildDefs::dump()) | 2985 if (!BuildDefs::dump()) |
2951 return; | 2986 return; |
2952 Ostream &Str = Func->getContext()->getStrDump(); | 2987 Ostream &Str = Func->getContext()->getStrDump(); |
2953 this->dumpDest(Func); | 2988 this->dumpDest(Func); |
2954 Str << " = pop." << this->getDest()->getType() << " "; | 2989 Str << " = pop." << this->getDest()->getType() << " "; |
2955 } | 2990 } |
2956 | 2991 |
2957 template <class Machine> | 2992 template <class Machine> |
2958 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { | 2993 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { |
2959 if (!BuildDefs::dump()) | 2994 if (!BuildDefs::dump()) |
2960 return; | 2995 return; |
2961 Ostream &Str = Func->getContext()->getStrEmit(); | 2996 Ostream &Str = Func->getContext()->getStrEmit(); |
2962 Str << "\tsubl\t$" << Amount << ", %esp"; | 2997 Str << "\tsubl\t$" << Amount << ", %esp"; |
2963 Func->getTarget()->updateStackAdjustment(Amount); | 2998 TargetLowering *Target = Func->getTarget(); |
| 2999 Target->updateStackAdjustment(Amount); |
2964 } | 3000 } |
2965 | 3001 |
2966 template <class Machine> | 3002 template <class Machine> |
2967 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { | 3003 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { |
2968 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3004 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2969 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3005 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2970 Asm->sub(IceType_i32, | 3006 Asm->sub(IceType_i32, |
2971 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 3007 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
2972 Immediate(Amount)); | 3008 Immediate(Amount)); |
2973 Func->getTarget()->updateStackAdjustment(Amount); | 3009 TargetLowering *Target = Func->getTarget(); |
| 3010 Target->updateStackAdjustment(Amount); |
2974 } | 3011 } |
2975 | 3012 |
2976 template <class Machine> | 3013 template <class Machine> |
2977 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { | 3014 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { |
2978 if (!BuildDefs::dump()) | 3015 if (!BuildDefs::dump()) |
2979 return; | 3016 return; |
2980 Ostream &Str = Func->getContext()->getStrDump(); | 3017 Ostream &Str = Func->getContext()->getStrDump(); |
2981 Str << "esp = sub.i32 esp, " << Amount; | 3018 Str << "esp = sub.i32 esp, " << Amount; |
2982 } | 3019 } |
2983 | 3020 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3093 this->Dest->emit(Func); | 3130 this->Dest->emit(Func); |
3094 } | 3131 } |
3095 | 3132 |
3096 template <class Machine> | 3133 template <class Machine> |
3097 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { | 3134 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { |
3098 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); | 3135 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); |
3099 assert(this->getDest()->getType() == IceType_i1); | 3136 assert(this->getDest()->getType() == IceType_i1); |
3100 assert(this->getSrcSize() == 0); | 3137 assert(this->getSrcSize() == 0); |
3101 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3138 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3102 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 3140 TargetLowering *Target = Func->getTarget(); |
3103 if (this->getDest()->hasReg()) | 3141 if (this->getDest()->hasReg()) |
3104 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( | 3142 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( |
3105 this->getDest()->getRegNum())); | 3143 this->getDest()->getRegNum())); |
3106 else | 3144 else |
3107 Asm->setcc( | 3145 Asm->setcc( |
3108 Condition, | 3146 Condition, |
3109 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 3147 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
3110 Func->getTarget()) | 3148 Target) |
3111 ->stackVarToAsmOperand(this->getDest())); | 3149 ->stackVarToAsmOperand(this->getDest())); |
3112 return; | 3150 return; |
3113 } | 3151 } |
3114 | 3152 |
3115 template <class Machine> | 3153 template <class Machine> |
3116 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { | 3154 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { |
3117 if (!BuildDefs::dump()) | 3155 if (!BuildDefs::dump()) |
3118 return; | 3156 return; |
3119 Ostream &Str = Func->getContext()->getStrDump(); | 3157 Ostream &Str = Func->getContext()->getStrDump(); |
3120 Str << "setcc." | 3158 Str << "setcc." |
(...skipping 20 matching lines...) Expand all Loading... |
3141 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { | 3179 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { |
3142 assert(this->getSrcSize() == 2); | 3180 assert(this->getSrcSize() == 2); |
3143 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3181 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3144 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3182 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
3145 Type Ty = this->getSrc(0)->getType(); | 3183 Type Ty = this->getSrc(0)->getType(); |
3146 const auto Mem = | 3184 const auto Mem = |
3147 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3185 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3148 this->getSrc(0)); | 3186 this->getSrc(0)); |
3149 assert(Mem->getSegmentRegister() == | 3187 assert(Mem->getSegmentRegister() == |
3150 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3188 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
| 3189 TargetLowering *Target = Func->getTarget(); |
3151 const typename InstX86Base<Machine>::Traits::Address Addr = | 3190 const typename InstX86Base<Machine>::Traits::Address Addr = |
3152 Mem->toAsmAddress(Asm); | 3191 Mem->toAsmAddress(Asm, Target); |
3153 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); | 3192 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); |
3154 assert(VarReg->hasReg()); | 3193 assert(VarReg->hasReg()); |
3155 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 3194 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
3156 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); | 3195 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
3157 Asm->xadd(Ty, Addr, Reg, this->Locked); | 3196 Asm->xadd(Ty, Addr, Reg, this->Locked); |
3158 } | 3197 } |
3159 | 3198 |
3160 template <class Machine> | 3199 template <class Machine> |
3161 void InstX86Xadd<Machine>::dump(const Cfg *Func) const { | 3200 void InstX86Xadd<Machine>::dump(const Cfg *Func) const { |
3162 if (!BuildDefs::dump()) | 3201 if (!BuildDefs::dump()) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3198 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); | 3237 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); |
3199 Asm->xchg(Ty, Reg0, Reg1); | 3238 Asm->xchg(Ty, Reg0, Reg1); |
3200 return; | 3239 return; |
3201 } | 3240 } |
3202 | 3241 |
3203 const auto *Mem = | 3242 const auto *Mem = |
3204 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3243 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3205 this->getSrc(0)); | 3244 this->getSrc(0)); |
3206 assert(Mem->getSegmentRegister() == | 3245 assert(Mem->getSegmentRegister() == |
3207 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3246 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
| 3247 TargetLowering *Target = Func->getTarget(); |
3208 const typename InstX86Base<Machine>::Traits::Address Addr = | 3248 const typename InstX86Base<Machine>::Traits::Address Addr = |
3209 Mem->toAsmAddress(Asm); | 3249 Mem->toAsmAddress(Asm, Target); |
3210 Asm->xchg(Ty, Addr, Reg1); | 3250 Asm->xchg(Ty, Addr, Reg1); |
3211 } | 3251 } |
3212 | 3252 |
3213 template <class Machine> | 3253 template <class Machine> |
3214 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { | 3254 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { |
3215 if (!BuildDefs::dump()) | 3255 if (!BuildDefs::dump()) |
3216 return; | 3256 return; |
3217 Ostream &Str = Func->getContext()->getStrDump(); | 3257 Ostream &Str = Func->getContext()->getStrDump(); |
3218 Type Ty = this->getSrc(0)->getType(); | 3258 Type Ty = this->getSrc(0)->getType(); |
3219 Str << "xchg." << Ty << " "; | 3259 Str << "xchg." << Ty << " "; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3270 return; | 3310 return; |
3271 Ostream &Str = Func->getContext()->getStrDump(); | 3311 Ostream &Str = Func->getContext()->getStrDump(); |
3272 Str << "IACA_END"; | 3312 Str << "IACA_END"; |
3273 } | 3313 } |
3274 | 3314 |
3275 } // end of namespace X86Internal | 3315 } // end of namespace X86Internal |
3276 | 3316 |
3277 } // end of namespace Ice | 3317 } // end of namespace Ice |
3278 | 3318 |
3279 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H | 3319 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H |
OLD | NEW |