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 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Operand *CallTarget = getCallTarget(); | 572 Operand *CallTarget = getCallTarget(); |
573 TargetLowering *Target = Func->getTarget(); | 573 auto *Target = InstX86Base<Machine>::getTarget(Func); |
574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { | 574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { |
575 // Emit without a leading '$'. | 575 // Emit without a leading '$'. |
576 Str << CI->getValue(); | 576 Str << CI->getValue(); |
577 } else if (const auto DirectCallTarget = | 577 } else if (const auto DirectCallTarget = |
578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { | 578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
579 DirectCallTarget->emitWithoutPrefix(Target); | 579 DirectCallTarget->emitWithoutPrefix(Target); |
580 } else { | 580 } else { |
581 Str << "*"; | 581 Str << "*"; |
582 CallTarget->emit(Func); | 582 CallTarget->emit(Func); |
583 } | 583 } |
584 Target->resetStackAdjustment(); | 584 Target->resetStackAdjustment(); |
585 } | 585 } |
586 | 586 |
587 template <class Machine> | 587 template <class Machine> |
588 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { | 588 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { |
589 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 589 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
590 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 590 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
591 Operand *CallTarget = getCallTarget(); | 591 Operand *CallTarget = getCallTarget(); |
592 TargetLowering *Target = Func->getTarget(); | 592 auto *Target = InstX86Base<Machine>::getTarget(Func); |
593 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) { | 593 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) { |
594 if (Var->hasReg()) { | 594 if (Var->hasReg()) { |
595 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); | 595 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
596 } else { | 596 } else { |
597 Asm->call( | 597 Asm->call(Target->stackVarToAsmOperand(Var)); |
598 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
599 Target) | |
600 ->stackVarToAsmOperand(Var)); | |
601 } | 598 } |
602 } else if (const auto *Mem = llvm::dyn_cast< | 599 } else if (const auto *Mem = llvm::dyn_cast< |
603 typename InstX86Base<Machine>::Traits::X86OperandMem>( | 600 typename InstX86Base<Machine>::Traits::X86OperandMem>( |
604 CallTarget)) { | 601 CallTarget)) { |
605 assert(Mem->getSegmentRegister() == | 602 assert(Mem->getSegmentRegister() == |
606 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
607 Asm->call(Mem->toAsmAddress(Asm, Target)); | 604 Asm->call(Mem->toAsmAddress(Asm, Target)); |
608 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { | 605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
609 assert(CR->getOffset() == 0 && "We only support calling a function"); | 606 assert(CR->getOffset() == 0 && "We only support calling a function"); |
610 Asm->call(CR); | 607 Asm->call(CR); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 << "\t"; | 644 << "\t"; |
648 Src1->emit(Func); | 645 Src1->emit(Func); |
649 Str << ", "; | 646 Str << ", "; |
650 Dest->emit(Func); | 647 Dest->emit(Func); |
651 } | 648 } |
652 | 649 |
653 template <class Machine> | 650 template <class Machine> |
654 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, | 651 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, |
655 const typename InstX86Base< | 652 const typename InstX86Base< |
656 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { | 653 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { |
657 TargetLowering *Target = Func->getTarget(); | 654 auto *Target = InstX86Base<Machine>::getTarget(Func); |
658 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 655 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
659 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 656 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
660 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { | 657 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { |
661 if (Var->hasReg()) { | 658 if (Var->hasReg()) { |
662 // We cheat a little and use GPRRegister even for byte operations. | 659 // We cheat a little and use GPRRegister even for byte operations. |
663 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = | 660 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
664 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); | 661 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
665 (Asm->*(Emitter.Reg))(Ty, VarReg); | 662 (Asm->*(Emitter.Reg))(Ty, VarReg); |
666 } else { | 663 } else { |
667 typename InstX86Base<Machine>::Traits::Address StackAddr( | 664 typename InstX86Base<Machine>::Traits::Address StackAddr( |
668 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 665 Target->stackVarToAsmOperand(Var)); |
669 Target) | |
670 ->stackVarToAsmOperand(Var)); | |
671 (Asm->*(Emitter.Addr))(Ty, StackAddr); | 666 (Asm->*(Emitter.Addr))(Ty, StackAddr); |
672 } | 667 } |
673 } else if (const auto *Mem = llvm::dyn_cast< | 668 } else if (const auto *Mem = llvm::dyn_cast< |
674 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { | 669 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { |
675 Mem->emitSegmentOverride(Asm); | 670 Mem->emitSegmentOverride(Asm); |
676 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Target)); | 671 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Target)); |
677 } else { | 672 } else { |
678 llvm_unreachable("Unexpected operand type"); | 673 llvm_unreachable("Unexpected operand type"); |
679 } | 674 } |
680 } | 675 } |
681 | 676 |
682 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> | 677 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> |
683 void emitIASRegOpTyGPR( | 678 void emitIASRegOpTyGPR( |
684 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 679 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
685 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp | 680 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp |
686 &Emitter) { | 681 &Emitter) { |
687 TargetLowering *Target = Func->getTarget(); | 682 auto *Target = InstX86Base<Machine>::getTarget(Func); |
688 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 683 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
689 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 684 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
690 assert(Var->hasReg()); | 685 assert(Var->hasReg()); |
691 // We cheat a little and use GPRRegister even for byte operations. | 686 // We cheat a little and use GPRRegister even for byte operations. |
692 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = | 687 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
693 VarCanBeByte | 688 VarCanBeByte |
694 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) | 689 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) |
695 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); | 690 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
696 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 691 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
697 if (SrcVar->hasReg()) { | 692 if (SrcVar->hasReg()) { |
698 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = | 693 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
699 SrcCanBeByte | 694 SrcCanBeByte |
700 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) | 695 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) |
701 : InstX86Base<Machine>::Traits::getEncodedGPR( | 696 : InstX86Base<Machine>::Traits::getEncodedGPR( |
702 SrcVar->getRegNum()); | 697 SrcVar->getRegNum()); |
703 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); | 698 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); |
704 } else { | 699 } else { |
705 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 700 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
706 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 701 Target->stackVarToAsmOperand(SrcVar); |
707 Target) | |
708 ->stackVarToAsmOperand(SrcVar); | |
709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); | 702 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); |
710 } | 703 } |
711 } else if (const auto *Mem = llvm::dyn_cast< | 704 } else if (const auto *Mem = llvm::dyn_cast< |
712 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 705 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
713 Mem->emitSegmentOverride(Asm); | 706 Mem->emitSegmentOverride(Asm); |
714 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); | 707 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
715 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 708 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
716 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); | 709 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); |
717 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { | 710 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
718 AssemblerFixup *Fixup = | 711 AssemblerFixup *Fixup = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 } else { | 743 } else { |
751 llvm_unreachable("Unexpected operand type"); | 744 llvm_unreachable("Unexpected operand type"); |
752 } | 745 } |
753 } | 746 } |
754 | 747 |
755 template <class Machine> | 748 template <class Machine> |
756 void emitIASAsAddrOpTyGPR( | 749 void emitIASAsAddrOpTyGPR( |
757 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, | 750 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, |
758 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp | 751 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp |
759 &Emitter) { | 752 &Emitter) { |
760 TargetLowering *Target = Func->getTarget(); | 753 auto *Target = InstX86Base<Machine>::getTarget(Func); |
761 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { | 754 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { |
762 assert(!Op0Var->hasReg()); | 755 assert(!Op0Var->hasReg()); |
763 typename InstX86Base<Machine>::Traits::Address StackAddr( | 756 typename InstX86Base<Machine>::Traits::Address StackAddr( |
764 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 757 Target->stackVarToAsmOperand(Op0Var)); |
765 Target) | |
766 ->stackVarToAsmOperand(Op0Var)); | |
767 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); | 758 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); |
768 } else if (const auto *Op0Mem = llvm::dyn_cast< | 759 } else if (const auto *Op0Mem = llvm::dyn_cast< |
769 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { | 760 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { |
770 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 761 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
771 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 762 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
772 Op0Mem->emitSegmentOverride(Asm); | 763 Op0Mem->emitSegmentOverride(Asm); |
773 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm, Target), | 764 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm, Target), |
774 Op1, Emitter); | 765 Op1, Emitter); |
775 } else if (const auto *Split = llvm::dyn_cast< | 766 } else if (const auto *Split = llvm::dyn_cast< |
776 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { | 767 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
834 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); | 825 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); |
835 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); | 826 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); |
836 } | 827 } |
837 } | 828 } |
838 | 829 |
839 template <class Machine> | 830 template <class Machine> |
840 void emitIASXmmShift( | 831 void emitIASXmmShift( |
841 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 832 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
842 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp | 833 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp |
843 &Emitter) { | 834 &Emitter) { |
844 TargetLowering *Target = Func->getTarget(); | 835 auto *Target = InstX86Base<Machine>::getTarget(Func); |
845 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 836 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
846 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 837 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
847 assert(Var->hasReg()); | 838 assert(Var->hasReg()); |
848 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = | 839 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
849 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); | 840 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
850 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 841 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
851 if (SrcVar->hasReg()) { | 842 if (SrcVar->hasReg()) { |
852 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 843 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
853 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 844 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
854 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); | 845 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
855 } else { | 846 } else { |
856 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 847 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
857 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 848 Target->stackVarToAsmOperand(SrcVar); |
858 Target) | |
859 ->stackVarToAsmOperand(SrcVar); | |
860 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 849 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
861 } | 850 } |
862 } else if (const auto *Mem = llvm::dyn_cast< | 851 } else if (const auto *Mem = llvm::dyn_cast< |
863 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 852 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
864 assert(Mem->getSegmentRegister() == | 853 assert(Mem->getSegmentRegister() == |
865 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 854 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
866 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); | 855 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
867 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 856 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
868 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); | 857 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); |
869 } else { | 858 } else { |
870 llvm_unreachable("Unexpected operand type"); | 859 llvm_unreachable("Unexpected operand type"); |
871 } | 860 } |
872 } | 861 } |
873 | 862 |
874 template <class Machine> | 863 template <class Machine> |
875 void emitIASRegOpTyXMM( | 864 void emitIASRegOpTyXMM( |
876 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 865 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
877 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 866 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
878 &Emitter) { | 867 &Emitter) { |
879 TargetLowering *Target = Func->getTarget(); | 868 auto *Target = InstX86Base<Machine>::getTarget(Func); |
880 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 869 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
881 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 870 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
882 assert(Var->hasReg()); | 871 assert(Var->hasReg()); |
883 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = | 872 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
884 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); | 873 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
885 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 874 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
886 if (SrcVar->hasReg()) { | 875 if (SrcVar->hasReg()) { |
887 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 876 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
888 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 877 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
889 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); | 878 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
890 } else { | 879 } else { |
891 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 880 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
892 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 881 Target->stackVarToAsmOperand(SrcVar); |
893 Target) | |
894 ->stackVarToAsmOperand(SrcVar); | |
895 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 882 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
896 } | 883 } |
897 } else if (const auto *Mem = llvm::dyn_cast< | 884 } else if (const auto *Mem = llvm::dyn_cast< |
898 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 885 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
899 assert(Mem->getSegmentRegister() == | 886 assert(Mem->getSegmentRegister() == |
900 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 887 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
901 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); | 888 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target)); |
902 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 889 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
903 (Asm->*(Emitter.XmmAddr))( | 890 (Asm->*(Emitter.XmmAddr))( |
904 Ty, VarReg, | 891 Ty, VarReg, |
905 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 892 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
906 } else { | 893 } else { |
907 llvm_unreachable("Unexpected operand type"); | 894 llvm_unreachable("Unexpected operand type"); |
908 } | 895 } |
909 } | 896 } |
910 | 897 |
911 template <class Machine, typename DReg_t, typename SReg_t, | 898 template <class Machine, typename DReg_t, typename SReg_t, |
912 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> | 899 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> |
913 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, | 900 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, |
914 Type SrcTy, const Operand *Src, | 901 Type SrcTy, const Operand *Src, |
915 const typename InstX86Base<Machine>::Traits::Assembler:: | 902 const typename InstX86Base<Machine>::Traits::Assembler:: |
916 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) { | 903 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) { |
917 TargetLowering *Target = Func->getTarget(); | 904 auto *Target = InstX86Base<Machine>::getTarget(Func); |
918 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 905 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
919 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 906 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
920 assert(Dest->hasReg()); | 907 assert(Dest->hasReg()); |
921 DReg_t DestReg = destEnc(Dest->getRegNum()); | 908 DReg_t DestReg = destEnc(Dest->getRegNum()); |
922 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 909 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
923 if (SrcVar->hasReg()) { | 910 if (SrcVar->hasReg()) { |
924 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); | 911 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
925 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); | 912 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); |
926 } else { | 913 } else { |
927 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 914 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
928 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 915 Target->stackVarToAsmOperand(SrcVar); |
929 Target) | |
930 ->stackVarToAsmOperand(SrcVar); | |
931 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); | 916 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); |
932 } | 917 } |
933 } else if (const auto *Mem = llvm::dyn_cast< | 918 } else if (const auto *Mem = llvm::dyn_cast< |
934 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 919 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
935 Mem->emitSegmentOverride(Asm); | 920 Mem->emitSegmentOverride(Asm); |
936 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, | 921 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, |
937 Mem->toAsmAddress(Asm, Target)); | 922 Mem->toAsmAddress(Asm, Target)); |
938 } else { | 923 } else { |
939 llvm_unreachable("Unexpected operand type"); | 924 llvm_unreachable("Unexpected operand type"); |
940 } | 925 } |
941 } | 926 } |
942 | 927 |
943 template <class Machine, typename DReg_t, typename SReg_t, | 928 template <class Machine, typename DReg_t, typename SReg_t, |
944 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> | 929 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> |
945 void emitIASThreeOpImmOps( | 930 void emitIASThreeOpImmOps( |
946 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, | 931 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, |
947 const Operand *Src1, | 932 const Operand *Src1, |
948 const typename InstX86Base<Machine>::Traits::Assembler:: | 933 const typename InstX86Base<Machine>::Traits::Assembler:: |
949 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) { | 934 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) { |
950 TargetLowering *Target = Func->getTarget(); | 935 auto *Target = InstX86Base<Machine>::getTarget(Func); |
951 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 936 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
952 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 937 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
953 // This only handles Dest being a register, and Src1 being an immediate. | 938 // This only handles Dest being a register, and Src1 being an immediate. |
954 assert(Dest->hasReg()); | 939 assert(Dest->hasReg()); |
955 DReg_t DestReg = destEnc(Dest->getRegNum()); | 940 DReg_t DestReg = destEnc(Dest->getRegNum()); |
956 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); | 941 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); |
957 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { | 942 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { |
958 if (SrcVar->hasReg()) { | 943 if (SrcVar->hasReg()) { |
959 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); | 944 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
960 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); | 945 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); |
961 } else { | 946 } else { |
962 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 947 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
963 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 948 Target->stackVarToAsmOperand(SrcVar); |
964 Target) | |
965 ->stackVarToAsmOperand(SrcVar); | |
966 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); | 949 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); |
967 } | 950 } |
968 } else if (const auto *Mem = llvm::dyn_cast< | 951 } else if (const auto *Mem = llvm::dyn_cast< |
969 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { | 952 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { |
970 Mem->emitSegmentOverride(Asm); | 953 Mem->emitSegmentOverride(Asm); |
971 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, | 954 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, |
972 Mem->toAsmAddress(Asm, Target), Imm); | 955 Mem->toAsmAddress(Asm, Target), Imm); |
973 } else { | 956 } else { |
974 llvm_unreachable("Unexpected operand type"); | 957 llvm_unreachable("Unexpected operand type"); |
975 } | 958 } |
976 } | 959 } |
977 | 960 |
978 template <class Machine> | 961 template <class Machine> |
979 void emitIASMovlikeXMM( | 962 void emitIASMovlikeXMM( |
980 const Cfg *Func, const Variable *Dest, const Operand *Src, | 963 const Cfg *Func, const Variable *Dest, const Operand *Src, |
981 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps | 964 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps |
982 Emitter) { | 965 Emitter) { |
983 TargetLowering *Target = Func->getTarget(); | 966 auto *Target = InstX86Base<Machine>::getTarget(Func); |
984 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 967 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
985 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 968 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
986 if (Dest->hasReg()) { | 969 if (Dest->hasReg()) { |
987 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = | 970 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
988 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); | 971 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
989 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 972 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
990 if (SrcVar->hasReg()) { | 973 if (SrcVar->hasReg()) { |
991 (Asm->*(Emitter.XmmXmm))( | 974 (Asm->*(Emitter.XmmXmm))( |
992 DestReg, | 975 DestReg, |
993 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 976 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
994 } else { | 977 } else { |
995 typename InstX86Base<Machine>::Traits::Address StackAddr( | 978 typename InstX86Base<Machine>::Traits::Address StackAddr( |
996 static_cast< | 979 Target->stackVarToAsmOperand(SrcVar)); |
997 typename InstX86Base<Machine>::Traits::TargetLowering *>(Target) | |
998 ->stackVarToAsmOperand(SrcVar)); | |
999 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); | 980 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); |
1000 } | 981 } |
1001 } else if (const auto *SrcMem = llvm::dyn_cast< | 982 } else if (const auto *SrcMem = llvm::dyn_cast< |
1002 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 983 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
1003 assert(SrcMem->getSegmentRegister() == | 984 assert(SrcMem->getSegmentRegister() == |
1004 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 985 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1005 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm, Target)); | 986 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm, Target)); |
1006 } else { | 987 } else { |
1007 llvm_unreachable("Unexpected operand type"); | 988 llvm_unreachable("Unexpected operand type"); |
1008 } | 989 } |
1009 } else { | 990 } else { |
1010 typename InstX86Base<Machine>::Traits::Address StackAddr( | 991 typename InstX86Base<Machine>::Traits::Address StackAddr( |
1011 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 992 Target->stackVarToAsmOperand(Dest)); |
1012 Target) | |
1013 ->stackVarToAsmOperand(Dest)); | |
1014 // Src must be a register in this case. | 993 // Src must be a register in this case. |
1015 const auto *SrcVar = llvm::cast<Variable>(Src); | 994 const auto *SrcVar = llvm::cast<Variable>(Src); |
1016 assert(SrcVar->hasReg()); | 995 assert(SrcVar->hasReg()); |
1017 (Asm->*(Emitter.AddrXmm))( | 996 (Asm->*(Emitter.AddrXmm))( |
1018 StackAddr, | 997 StackAddr, |
1019 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 998 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
1020 } | 999 } |
1021 } | 1000 } |
1022 | 1001 |
1023 template <class Machine> | 1002 template <class Machine> |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1059 this->emitTwoAddress(buf, this, Func); | 1038 this->emitTwoAddress(buf, this, Func); |
1060 } | 1039 } |
1061 | 1040 |
1062 template <class Machine> | 1041 template <class Machine> |
1063 void InstX86Pmull<Machine>::emit(const Cfg *Func) const { | 1042 void InstX86Pmull<Machine>::emit(const Cfg *Func) const { |
1064 if (!BuildDefs::dump()) | 1043 if (!BuildDefs::dump()) |
1065 return; | 1044 return; |
1066 char buf[30]; | 1045 char buf[30]; |
1067 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || | 1046 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || |
1068 this->getDest()->getType() == IceType_v8i16; | 1047 this->getDest()->getType() == IceType_v8i16; |
1069 TargetLowering *Target = Func->getTarget(); | 1048 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1070 bool InstructionSetIsValid = | 1049 bool InstructionSetIsValid = |
1071 this->getDest()->getType() == IceType_v8i16 || | 1050 this->getDest()->getType() == IceType_v8i16 || |
1072 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1051 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
1073 Target) | |
1074 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; | |
1075 (void)TypesAreValid; | 1052 (void)TypesAreValid; |
1076 (void)InstructionSetIsValid; | 1053 (void)InstructionSetIsValid; |
1077 assert(TypesAreValid); | 1054 assert(TypesAreValid); |
1078 assert(InstructionSetIsValid); | 1055 assert(InstructionSetIsValid); |
1079 snprintf( | 1056 snprintf( |
1080 buf, llvm::array_lengthof(buf), "pmull%s", | 1057 buf, llvm::array_lengthof(buf), "pmull%s", |
1081 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] | 1058 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
1082 .PackString); | 1059 .PackString); |
1083 this->emitTwoAddress(buf, this, Func); | 1060 this->emitTwoAddress(buf, this, Func); |
1084 } | 1061 } |
1085 | 1062 |
1086 template <class Machine> | 1063 template <class Machine> |
1087 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { | 1064 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { |
1088 Type Ty = this->getDest()->getType(); | 1065 Type Ty = this->getDest()->getType(); |
1089 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; | 1066 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; |
1090 TargetLowering *Target = Func->getTarget(); | 1067 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1091 bool InstructionSetIsValid = | 1068 bool InstructionSetIsValid = |
1092 Ty == IceType_v8i16 || | 1069 Ty == IceType_v8i16 || |
1093 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1070 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
1094 Target) | |
1095 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; | |
1096 (void)TypesAreValid; | 1071 (void)TypesAreValid; |
1097 (void)InstructionSetIsValid; | 1072 (void)InstructionSetIsValid; |
1098 assert(TypesAreValid); | 1073 assert(TypesAreValid); |
1099 assert(InstructionSetIsValid); | 1074 assert(InstructionSetIsValid); |
1100 assert(this->getSrcSize() == 2); | 1075 assert(this->getSrcSize() == 2); |
1101 Type ElementTy = typeElementType(Ty); | 1076 Type ElementTy = typeElementType(Ty); |
1102 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), | 1077 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), |
1103 this->Emitter); | 1078 this->Emitter); |
1104 } | 1079 } |
1105 | 1080 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1229 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0); | 1204 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0); |
1230 const Variable *Dest = Inst->getDest(); | 1205 const Variable *Dest = Inst->getDest(); |
1231 const Operand *Src = Inst->getSrc(1); | 1206 const Operand *Src = Inst->getSrc(1); |
1232 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter); | 1207 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter); |
1233 } | 1208 } |
1234 | 1209 |
1235 template <class Machine> | 1210 template <class Machine> |
1236 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { | 1211 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { |
1237 if (!BuildDefs::dump()) | 1212 if (!BuildDefs::dump()) |
1238 return; | 1213 return; |
1239 TargetLowering *Target = Func->getTarget(); | 1214 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1240 (void)Target; | 1215 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1241 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
1242 Target) | |
1243 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
1244 emitVariableBlendInst<Machine>(this->Opcode, this, Func); | 1216 emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
1245 } | 1217 } |
1246 | 1218 |
1247 template <class Machine> | 1219 template <class Machine> |
1248 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { | 1220 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { |
1249 TargetLowering *Target = Func->getTarget(); | 1221 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1250 (void)Target; | 1222 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1251 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
1252 Target) | |
1253 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
1254 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 1223 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
1255 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, | 1224 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, |
1256 &InstX86Base<Machine>::Traits::Assembler::blendvps}; | 1225 &InstX86Base<Machine>::Traits::Assembler::blendvps}; |
1257 emitIASVariableBlendInst<Machine>(this, Func, Emitter); | 1226 emitIASVariableBlendInst<Machine>(this, Func, Emitter); |
1258 } | 1227 } |
1259 | 1228 |
1260 template <class Machine> | 1229 template <class Machine> |
1261 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { | 1230 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { |
1262 if (!BuildDefs::dump()) | 1231 if (!BuildDefs::dump()) |
1263 return; | 1232 return; |
1264 TargetLowering *Target = Func->getTarget(); | 1233 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1265 (void)Target; | 1234 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1266 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
1267 Target) | |
1268 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
1269 emitVariableBlendInst<Machine>(this->Opcode, this, Func); | 1235 emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
1270 } | 1236 } |
1271 | 1237 |
1272 template <class Machine> | 1238 template <class Machine> |
1273 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { | 1239 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { |
1274 TargetLowering *Target = Func->getTarget(); | 1240 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1275 (void)Target; | 1241 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1276 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
1277 Target) | |
1278 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
1279 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 1242 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
1280 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, | 1243 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, |
1281 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; | 1244 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; |
1282 emitIASVariableBlendInst<Machine>(this, Func, Emitter); | 1245 emitIASVariableBlendInst<Machine>(this, Func, Emitter); |
1283 } | 1246 } |
1284 | 1247 |
1285 template <class Machine> | 1248 template <class Machine> |
1286 void InstX86Imul<Machine>::emit(const Cfg *Func) const { | 1249 void InstX86Imul<Machine>::emit(const Cfg *Func) const { |
1287 if (!BuildDefs::dump()) | 1250 if (!BuildDefs::dump()) |
1288 return; | 1251 return; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 1335 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
1373 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 1336 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
1374 InstX86Base<Machine>::Traits::getEncodedGPR, | 1337 InstX86Base<Machine>::Traits::getEncodedGPR, |
1375 InstX86Base<Machine>::Traits::getEncodedGPR>( | 1338 InstX86Base<Machine>::Traits::getEncodedGPR>( |
1376 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); | 1339 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
1377 } | 1340 } |
1378 | 1341 |
1379 template <class Machine> | 1342 template <class Machine> |
1380 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { | 1343 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { |
1381 assert(this->getSrcSize() == 3); | 1344 assert(this->getSrcSize() == 3); |
1382 TargetLowering *Target = Func->getTarget(); | 1345 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1383 (void)Target; | 1346 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
1384 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
1385 Target) | |
1386 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
1387 const Variable *Dest = this->getDest(); | 1347 const Variable *Dest = this->getDest(); |
1388 assert(Dest == this->getSrc(0)); | 1348 assert(Dest == this->getSrc(0)); |
1389 Type Ty = Dest->getType(); | 1349 Type Ty = Dest->getType(); |
1390 static const typename InstX86Base<Machine>::Traits::Assembler:: | 1350 static const typename InstX86Base<Machine>::Traits::Assembler:: |
1391 template ThreeOpImmEmitter< | 1351 template ThreeOpImmEmitter< |
1392 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, | 1352 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
1393 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> | 1353 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> |
1394 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, | 1354 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, |
1395 &InstX86Base<Machine>::Traits::Assembler::insertps}; | 1355 &InstX86Base<Machine>::Traits::Assembler::insertps}; |
1396 emitIASThreeOpImmOps< | 1356 emitIASThreeOpImmOps< |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1622 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { | 1582 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { |
1623 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); | 1583 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); |
1624 assert(this->getDest()->hasReg()); | 1584 assert(this->getDest()->hasReg()); |
1625 assert(this->getSrcSize() == 2); | 1585 assert(this->getSrcSize() == 2); |
1626 Operand *Src = this->getSrc(1); | 1586 Operand *Src = this->getSrc(1); |
1627 Type SrcTy = Src->getType(); | 1587 Type SrcTy = Src->getType(); |
1628 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || | 1588 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || |
1629 (InstX86Base<Machine>::Traits::Is64Bit)); | 1589 (InstX86Base<Machine>::Traits::Is64Bit)); |
1630 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1590 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1631 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1591 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1632 TargetLowering *Target = Func->getTarget(); | 1592 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1633 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 1593 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
1634 if (SrcVar->hasReg()) { | 1594 if (SrcVar->hasReg()) { |
1635 Asm->cmov( | 1595 Asm->cmov( |
1636 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1596 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1637 this->getDest()->getRegNum()), | 1597 this->getDest()->getRegNum()), |
1638 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); | 1598 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
1639 } else { | 1599 } else { |
1640 Asm->cmov( | 1600 Asm->cmov( |
1641 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1601 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1642 this->getDest()->getRegNum()), | 1602 this->getDest()->getRegNum()), |
1643 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1603 Target->stackVarToAsmOperand(SrcVar)); |
1644 Target) | |
1645 ->stackVarToAsmOperand(SrcVar)); | |
1646 } | 1604 } |
1647 } else if (const auto *Mem = llvm::dyn_cast< | 1605 } else if (const auto *Mem = llvm::dyn_cast< |
1648 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 1606 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
1649 assert(Mem->getSegmentRegister() == | 1607 assert(Mem->getSegmentRegister() == |
1650 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1608 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1651 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1609 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1652 this->getDest()->getRegNum()), | 1610 this->getDest()->getRegNum()), |
1653 Mem->toAsmAddress(Asm, Target)); | 1611 Mem->toAsmAddress(Asm, Target)); |
1654 } else { | 1612 } else { |
1655 llvm_unreachable("Unexpected operand type"); | 1613 llvm_unreachable("Unexpected operand type"); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 | 1647 |
1690 template <class Machine> | 1648 template <class Machine> |
1691 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { | 1649 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { |
1692 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1650 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1693 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1651 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1694 assert(this->getSrcSize() == 2); | 1652 assert(this->getSrcSize() == 2); |
1695 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); | 1653 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); |
1696 // Assuming there isn't any load folding for cmpps, and vector constants are | 1654 // Assuming there isn't any load folding for cmpps, and vector constants are |
1697 // not allowed in PNaCl. | 1655 // not allowed in PNaCl. |
1698 assert(llvm::isa<Variable>(this->getSrc(1))); | 1656 assert(llvm::isa<Variable>(this->getSrc(1))); |
1699 TargetLowering *Target = Func->getTarget(); | 1657 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1700 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); | 1658 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
1701 if (SrcVar->hasReg()) { | 1659 if (SrcVar->hasReg()) { |
1702 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( | 1660 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
1703 this->getDest()->getRegNum()), | 1661 this->getDest()->getRegNum()), |
1704 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), | 1662 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), |
1705 Condition); | 1663 Condition); |
1706 } else { | 1664 } else { |
1707 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 1665 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
1708 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1666 Target->stackVarToAsmOperand(SrcVar); |
1709 Target) | |
1710 ->stackVarToAsmOperand(SrcVar); | |
1711 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( | 1667 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
1712 this->getDest()->getRegNum()), | 1668 this->getDest()->getRegNum()), |
1713 SrcStackAddr, Condition); | 1669 SrcStackAddr, Condition); |
1714 } | 1670 } |
1715 } | 1671 } |
1716 | 1672 |
1717 template <class Machine> | 1673 template <class Machine> |
1718 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { | 1674 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { |
1719 if (!BuildDefs::dump()) | 1675 if (!BuildDefs::dump()) |
1720 return; | 1676 return; |
(...skipping 22 matching lines...) Expand all Loading... |
1743 Str << ", "; | 1699 Str << ", "; |
1744 this->getSrc(0)->emit(Func); | 1700 this->getSrc(0)->emit(Func); |
1745 } | 1701 } |
1746 | 1702 |
1747 template <class Machine> | 1703 template <class Machine> |
1748 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { | 1704 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { |
1749 assert(this->getSrcSize() == 3); | 1705 assert(this->getSrcSize() == 3); |
1750 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1706 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1751 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1707 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1752 Type Ty = this->getSrc(0)->getType(); | 1708 Type Ty = this->getSrc(0)->getType(); |
1753 TargetLowering *Target = Func->getTarget(); | 1709 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1754 const auto Mem = | 1710 const auto Mem = |
1755 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1711 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1756 this->getSrc(0)); | 1712 this->getSrc(0)); |
1757 assert(Mem->getSegmentRegister() == | 1713 assert(Mem->getSegmentRegister() == |
1758 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1714 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1759 const typename InstX86Base<Machine>::Traits::Address Addr = | 1715 const typename InstX86Base<Machine>::Traits::Address Addr = |
1760 Mem->toAsmAddress(Asm, Target); | 1716 Mem->toAsmAddress(Asm, Target); |
1761 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); | 1717 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); |
1762 assert(VarReg->hasReg()); | 1718 assert(VarReg->hasReg()); |
1763 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 1719 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
(...skipping 29 matching lines...) Expand all Loading... |
1793 template <class Machine> | 1749 template <class Machine> |
1794 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { | 1750 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { |
1795 assert(this->getSrcSize() == 5); | 1751 assert(this->getSrcSize() == 5); |
1796 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1752 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1797 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1753 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1798 const auto Mem = | 1754 const auto Mem = |
1799 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1755 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1800 this->getSrc(0)); | 1756 this->getSrc(0)); |
1801 assert(Mem->getSegmentRegister() == | 1757 assert(Mem->getSegmentRegister() == |
1802 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1758 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1803 TargetLowering *Target = Func->getTarget(); | 1759 auto *Target = InstX86Base<Machine>::getTarget(Func); |
1804 const typename InstX86Base<Machine>::Traits::Address Addr = | 1760 const typename InstX86Base<Machine>::Traits::Address Addr = |
1805 Mem->toAsmAddress(Asm, Target); | 1761 Mem->toAsmAddress(Asm, Target); |
1806 Asm->cmpxchg8b(Addr, this->Locked); | 1762 Asm->cmpxchg8b(Addr, this->Locked); |
1807 } | 1763 } |
1808 | 1764 |
1809 template <class Machine> | 1765 template <class Machine> |
1810 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { | 1766 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { |
1811 if (!BuildDefs::dump()) | 1767 if (!BuildDefs::dump()) |
1812 return; | 1768 return; |
1813 Ostream &Str = Func->getContext()->getStrDump(); | 1769 Ostream &Str = Func->getContext()->getStrDump(); |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2135 const Operand *Src = this->getSrc(0); | 2091 const Operand *Src = this->getSrc(0); |
2136 Type DestTy = Dest->getType(); | 2092 Type DestTy = Dest->getType(); |
2137 if (isScalarFloatingType(DestTy)) { | 2093 if (isScalarFloatingType(DestTy)) { |
2138 // Src must be a register, since Dest is a Mem operand of some kind. | 2094 // Src must be a register, since Dest is a Mem operand of some kind. |
2139 const auto *SrcVar = llvm::cast<Variable>(Src); | 2095 const auto *SrcVar = llvm::cast<Variable>(Src); |
2140 assert(SrcVar->hasReg()); | 2096 assert(SrcVar->hasReg()); |
2141 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 2097 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
2142 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 2098 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
2143 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2099 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2144 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2100 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2145 TargetLowering *Target = Func->getTarget(); | 2101 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2146 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { | 2102 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { |
2147 assert(!DestVar->hasReg()); | 2103 assert(!DestVar->hasReg()); |
2148 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2104 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2149 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2105 Target->stackVarToAsmOperand(DestVar)); |
2150 Target) | |
2151 ->stackVarToAsmOperand(DestVar)); | |
2152 Asm->movss(DestTy, StackAddr, SrcReg); | 2106 Asm->movss(DestTy, StackAddr, SrcReg); |
2153 } else { | 2107 } else { |
2154 const auto DestMem = | 2108 const auto DestMem = |
2155 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2109 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2156 Dest); | 2110 Dest); |
2157 assert(DestMem->getSegmentRegister() == | 2111 assert(DestMem->getSegmentRegister() == |
2158 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2112 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2159 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg); | 2113 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg); |
2160 } | 2114 } |
2161 return; | 2115 return; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2198 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2152 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2199 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2153 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2200 assert(this->getSrcSize() == 2); | 2154 assert(this->getSrcSize() == 2); |
2201 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2155 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2202 const auto DestMem = | 2156 const auto DestMem = |
2203 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2157 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2204 this->getSrc(1)); | 2158 this->getSrc(1)); |
2205 assert(DestMem->getSegmentRegister() == | 2159 assert(DestMem->getSegmentRegister() == |
2206 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2160 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2207 assert(SrcVar->hasReg()); | 2161 assert(SrcVar->hasReg()); |
2208 TargetLowering *Target = Func->getTarget(); | 2162 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2209 Asm->movups(DestMem->toAsmAddress(Asm, Target), | 2163 Asm->movups(DestMem->toAsmAddress(Asm, Target), |
2210 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2164 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2211 } | 2165 } |
2212 | 2166 |
2213 template <class Machine> | 2167 template <class Machine> |
2214 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { | 2168 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { |
2215 if (!BuildDefs::dump()) | 2169 if (!BuildDefs::dump()) |
2216 return; | 2170 return; |
2217 Ostream &Str = Func->getContext()->getStrDump(); | 2171 Ostream &Str = Func->getContext()->getStrDump(); |
2218 Str << "storep." << this->getSrc(0)->getType() << " "; | 2172 Str << "storep." << this->getSrc(0)->getType() << " "; |
(...skipping 22 matching lines...) Expand all Loading... |
2241 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2195 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2242 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2196 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2243 assert(this->getSrcSize() == 2); | 2197 assert(this->getSrcSize() == 2); |
2244 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2198 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2245 const auto DestMem = | 2199 const auto DestMem = |
2246 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2200 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2247 this->getSrc(1)); | 2201 this->getSrc(1)); |
2248 assert(DestMem->getSegmentRegister() == | 2202 assert(DestMem->getSegmentRegister() == |
2249 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2203 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2250 assert(SrcVar->hasReg()); | 2204 assert(SrcVar->hasReg()); |
2251 TargetLowering *Target = Func->getTarget(); | 2205 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2252 Asm->movq(DestMem->toAsmAddress(Asm, Target), | 2206 Asm->movq(DestMem->toAsmAddress(Asm, Target), |
2253 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2207 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2254 } | 2208 } |
2255 | 2209 |
2256 template <class Machine> | 2210 template <class Machine> |
2257 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { | 2211 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { |
2258 if (!BuildDefs::dump()) | 2212 if (!BuildDefs::dump()) |
2259 return; | 2213 return; |
2260 Ostream &Str = Func->getContext()->getStrDump(); | 2214 Ostream &Str = Func->getContext()->getStrDump(); |
2261 Str << "storeq." << this->getSrc(0)->getType() << " "; | 2215 Str << "storeq." << this->getSrc(0)->getType() << " "; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2305 << (!isScalarFloatingType(DestTy) | 2259 << (!isScalarFloatingType(DestTy) |
2306 ? this->getWidthString(DestTy) | 2260 ? this->getWidthString(DestTy) |
2307 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] | 2261 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] |
2308 .SdSsString) << "\t"; | 2262 .SdSsString) << "\t"; |
2309 } | 2263 } |
2310 // For an integer truncation operation, src is wider than dest. In this case, | 2264 // For an integer truncation operation, src is wider than dest. In this case, |
2311 // we use a mov instruction whose data width matches the narrower dest. | 2265 // we use a mov instruction whose data width matches the narrower dest. |
2312 // TODO: This assert disallows usages such as copying a floating | 2266 // TODO: This assert disallows usages such as copying a floating |
2313 // point value between a vector and a scalar (which movss is used for). Clean | 2267 // point value between a vector and a scalar (which movss is used for). Clean |
2314 // this up. | 2268 // this up. |
2315 TargetLowering *Target = Func->getTarget(); | 2269 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2316 (void)Target; | |
2317 assert(Target->typeWidthInBytesOnStack(DestTy) == | 2270 assert(Target->typeWidthInBytesOnStack(DestTy) == |
2318 Target->typeWidthInBytesOnStack(SrcTy)); | 2271 Target->typeWidthInBytesOnStack(SrcTy)); |
2319 const Operand *NewSrc = Src; | 2272 const Operand *NewSrc = Src; |
2320 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 2273 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
2321 int32_t NewRegNum = Variable::NoRegister; | 2274 int32_t NewRegNum = Variable::NoRegister; |
2322 if (SrcVar->hasReg()) | 2275 if (SrcVar->hasReg()) |
2323 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( | 2276 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( |
2324 DestTy, SrcVar->getRegNum()); | 2277 DestTy, SrcVar->getRegNum()); |
2325 if (SrcTy != DestTy) | 2278 if (SrcTy != DestTy) |
2326 NewSrc = SrcVar->asType(DestTy, NewRegNum); | 2279 NewSrc = SrcVar->asType(DestTy, NewRegNum); |
(...skipping 25 matching lines...) Expand all Loading... |
2352 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2305 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2353 static const typename InstX86Base< | 2306 static const typename InstX86Base< |
2354 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { | 2307 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { |
2355 &InstX86Base<Machine>::Traits::Assembler::mov, | 2308 &InstX86Base<Machine>::Traits::Assembler::mov, |
2356 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2309 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2357 // For an integer truncation operation, src is wider than dest. In this case, | 2310 // For an integer truncation operation, src is wider than dest. In this case, |
2358 // we use a mov instruction whose data width matches the narrower dest. | 2311 // we use a mov instruction whose data width matches the narrower dest. |
2359 // TODO: This assert disallows usages such as copying a floating | 2312 // TODO: This assert disallows usages such as copying a floating |
2360 // point value between a vector and a scalar (which movss is used for). Clean | 2313 // point value between a vector and a scalar (which movss is used for). Clean |
2361 // this up. | 2314 // this up. |
2362 TargetLowering *Target = Func->getTarget(); | 2315 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2363 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) == | 2316 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) == |
2364 Target->typeWidthInBytesOnStack(Src->getType())); | 2317 Target->typeWidthInBytesOnStack(Src->getType())); |
2365 if (Dest->hasReg()) { | 2318 if (Dest->hasReg()) { |
2366 if (isScalarFloatingType(DestTy)) { | 2319 if (isScalarFloatingType(DestTy)) { |
2367 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); | 2320 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); |
2368 return; | 2321 return; |
2369 } else { | 2322 } else { |
2370 assert(isScalarIntegerType(DestTy)); | 2323 assert(isScalarIntegerType(DestTy)); |
2371 // Widen DestTy for truncation (see above note). We should only do this | 2324 // Widen DestTy for truncation (see above note). We should only do this |
2372 // when both Src and Dest are integer types. | 2325 // when both Src and Dest are integer types. |
(...skipping 14 matching lines...) Expand all Loading... |
2387 if (isScalarIntegerType(SrcTy)) { | 2340 if (isScalarIntegerType(SrcTy)) { |
2388 SrcTy = DestTy; | 2341 SrcTy = DestTy; |
2389 } | 2342 } |
2390 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); | 2343 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); |
2391 return; | 2344 return; |
2392 } | 2345 } |
2393 } else { | 2346 } else { |
2394 // Dest must be Stack and Src *could* be a register. Use Src's type to | 2347 // Dest must be Stack and Src *could* be a register. Use Src's type to |
2395 // decide on the emitters. | 2348 // decide on the emitters. |
2396 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2349 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2397 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2350 Target->stackVarToAsmOperand(Dest)); |
2398 Target) | |
2399 ->stackVarToAsmOperand(Dest)); | |
2400 if (isScalarFloatingType(SrcTy)) { | 2351 if (isScalarFloatingType(SrcTy)) { |
2401 // Src must be a register. | 2352 // Src must be a register. |
2402 const auto *SrcVar = llvm::cast<Variable>(Src); | 2353 const auto *SrcVar = llvm::cast<Variable>(Src); |
2403 assert(SrcVar->hasReg()); | 2354 assert(SrcVar->hasReg()); |
2404 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2355 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2405 Func->getAssembler< | 2356 Func->getAssembler< |
2406 typename InstX86Base<Machine>::Traits::Assembler>(); | 2357 typename InstX86Base<Machine>::Traits::Assembler>(); |
2407 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( | 2358 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( |
2408 SrcVar->getRegNum())); | 2359 SrcVar->getRegNum())); |
2409 return; | 2360 return; |
2410 } else { | 2361 } else { |
2411 // Src can be a register or immediate. | 2362 // Src can be a register or immediate. |
2412 assert(isScalarIntegerType(SrcTy)); | 2363 assert(isScalarIntegerType(SrcTy)); |
2413 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); | 2364 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); |
2414 return; | 2365 return; |
2415 } | 2366 } |
2416 return; | 2367 return; |
2417 } | 2368 } |
2418 } | 2369 } |
2419 | 2370 |
2420 template <class Machine> | 2371 template <class Machine> |
2421 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { | 2372 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { |
2422 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2373 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2423 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2374 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2424 assert(this->getSrcSize() == 1); | 2375 assert(this->getSrcSize() == 1); |
2425 const Variable *Dest = this->getDest(); | 2376 const Variable *Dest = this->getDest(); |
2426 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2377 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2427 TargetLowering *Target = Func->getTarget(); | 2378 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2428 // For insert/extract element (one of Src/Dest is an Xmm vector and the other | 2379 // For insert/extract element (one of Src/Dest is an Xmm vector and the other |
2429 // is an int type). | 2380 // is an int type). |
2430 if (SrcVar->getType() == IceType_i32 || | 2381 if (SrcVar->getType() == IceType_i32 || |
2431 (InstX86Base<Machine>::Traits::Is64Bit && | 2382 (InstX86Base<Machine>::Traits::Is64Bit && |
2432 SrcVar->getType() == IceType_i64)) { | 2383 SrcVar->getType() == IceType_i64)) { |
2433 assert(isVectorType(Dest->getType()) || | 2384 assert(isVectorType(Dest->getType()) || |
2434 (isScalarFloatingType(Dest->getType()) && | 2385 (isScalarFloatingType(Dest->getType()) && |
2435 typeWidthInBytes(SrcVar->getType()) == | 2386 typeWidthInBytes(SrcVar->getType()) == |
2436 typeWidthInBytes(Dest->getType()))); | 2387 typeWidthInBytes(Dest->getType()))); |
2437 assert(Dest->hasReg()); | 2388 assert(Dest->hasReg()); |
2438 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = | 2389 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
2439 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); | 2390 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
2440 if (SrcVar->hasReg()) { | 2391 if (SrcVar->hasReg()) { |
2441 Asm->movd( | 2392 Asm->movd( |
2442 SrcVar->getType(), DestReg, | 2393 SrcVar->getType(), DestReg, |
2443 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); | 2394 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
2444 } else { | 2395 } else { |
2445 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2396 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2446 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2397 Target->stackVarToAsmOperand(SrcVar)); |
2447 Target) | |
2448 ->stackVarToAsmOperand(SrcVar)); | |
2449 Asm->movd(SrcVar->getType(), DestReg, StackAddr); | 2398 Asm->movd(SrcVar->getType(), DestReg, StackAddr); |
2450 } | 2399 } |
2451 } else { | 2400 } else { |
2452 assert(isVectorType(SrcVar->getType()) || | 2401 assert(isVectorType(SrcVar->getType()) || |
2453 (isScalarFloatingType(SrcVar->getType()) && | 2402 (isScalarFloatingType(SrcVar->getType()) && |
2454 typeWidthInBytes(SrcVar->getType()) == | 2403 typeWidthInBytes(SrcVar->getType()) == |
2455 typeWidthInBytes(Dest->getType()))); | 2404 typeWidthInBytes(Dest->getType()))); |
2456 assert(SrcVar->hasReg()); | 2405 assert(SrcVar->hasReg()); |
2457 assert(Dest->getType() == IceType_i32 || | 2406 assert(Dest->getType() == IceType_i32 || |
2458 (InstX86Base<Machine>::Traits::Is64Bit && | 2407 (InstX86Base<Machine>::Traits::Is64Bit && |
2459 Dest->getType() == IceType_i64)); | 2408 Dest->getType() == IceType_i64)); |
2460 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = | 2409 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
2461 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); | 2410 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
2462 if (Dest->hasReg()) { | 2411 if (Dest->hasReg()) { |
2463 Asm->movd(Dest->getType(), | 2412 Asm->movd(Dest->getType(), |
2464 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), | 2413 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), |
2465 SrcReg); | 2414 SrcReg); |
2466 } else { | 2415 } else { |
2467 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2416 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2468 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2417 Target->stackVarToAsmOperand(Dest)); |
2469 Target) | |
2470 ->stackVarToAsmOperand(Dest)); | |
2471 Asm->movd(Dest->getType(), StackAddr, SrcReg); | 2418 Asm->movd(Dest->getType(), StackAddr, SrcReg); |
2472 } | 2419 } |
2473 } | 2420 } |
2474 } | 2421 } |
2475 | 2422 |
2476 template <class Machine> | 2423 template <class Machine> |
2477 void InstX86Movp<Machine>::emit(const Cfg *Func) const { | 2424 void InstX86Movp<Machine>::emit(const Cfg *Func) const { |
2478 if (!BuildDefs::dump()) | 2425 if (!BuildDefs::dump()) |
2479 return; | 2426 return; |
2480 // TODO(wala,stichnot): movups works with all vector operands, but there | 2427 // TODO(wala,stichnot): movups works with all vector operands, but there |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2622 Str << "\tfld" << this->getFldString(Ty) << "\t"; | 2569 Str << "\tfld" << this->getFldString(Ty) << "\t"; |
2623 this->getSrc(0)->emit(Func); | 2570 this->getSrc(0)->emit(Func); |
2624 } | 2571 } |
2625 | 2572 |
2626 template <class Machine> | 2573 template <class Machine> |
2627 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { | 2574 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { |
2628 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2575 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2629 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2576 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2630 assert(this->getSrcSize() == 1); | 2577 assert(this->getSrcSize() == 1); |
2631 const Operand *Src = this->getSrc(0); | 2578 const Operand *Src = this->getSrc(0); |
2632 TargetLowering *Target = Func->getTarget(); | 2579 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2633 Type Ty = Src->getType(); | 2580 Type Ty = Src->getType(); |
2634 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { | 2581 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { |
2635 if (Var->hasReg()) { | 2582 if (Var->hasReg()) { |
2636 // This is a physical xmm register, so we need to spill it to a temporary | 2583 // This is a physical xmm register, so we need to spill it to a temporary |
2637 // stack slot. | 2584 // stack slot. |
2638 Immediate Width(typeWidthInBytes(Ty)); | 2585 Immediate Width(typeWidthInBytes(Ty)); |
2639 Asm->sub(IceType_i32, | 2586 Asm->sub(IceType_i32, |
2640 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2587 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
2641 Width); | 2588 Width); |
2642 typename InstX86Base<Machine>::Traits::Address StackSlot = | 2589 typename InstX86Base<Machine>::Traits::Address StackSlot = |
2643 typename InstX86Base<Machine>::Traits::Address( | 2590 typename InstX86Base<Machine>::Traits::Address( |
2644 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, | 2591 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, |
2645 AssemblerFixup::NoFixup); | 2592 AssemblerFixup::NoFixup); |
2646 Asm->movss(Ty, StackSlot, | 2593 Asm->movss(Ty, StackSlot, |
2647 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); | 2594 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); |
2648 Asm->fld(Ty, StackSlot); | 2595 Asm->fld(Ty, StackSlot); |
2649 Asm->add(IceType_i32, | 2596 Asm->add(IceType_i32, |
2650 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2597 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
2651 Width); | 2598 Width); |
2652 } else { | 2599 } else { |
2653 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2600 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2654 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2601 Target->stackVarToAsmOperand(Var)); |
2655 Target) | |
2656 ->stackVarToAsmOperand(Var)); | |
2657 Asm->fld(Ty, StackAddr); | 2602 Asm->fld(Ty, StackAddr); |
2658 } | 2603 } |
2659 } else if (const auto *Mem = llvm::dyn_cast< | 2604 } else if (const auto *Mem = llvm::dyn_cast< |
2660 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 2605 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
2661 assert(Mem->getSegmentRegister() == | 2606 assert(Mem->getSegmentRegister() == |
2662 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2607 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2663 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target)); | 2608 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target)); |
2664 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 2609 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
2665 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 2610 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
2666 } else { | 2611 } else { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2716 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2661 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2717 assert(this->getSrcSize() == 0); | 2662 assert(this->getSrcSize() == 0); |
2718 const Variable *Dest = this->getDest(); | 2663 const Variable *Dest = this->getDest(); |
2719 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to | 2664 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to |
2720 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, | 2665 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, |
2721 // the fstp should be kept for the SideEffects of popping the stack. | 2666 // the fstp should be kept for the SideEffects of popping the stack. |
2722 if (!Dest) { | 2667 if (!Dest) { |
2723 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); | 2668 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); |
2724 return; | 2669 return; |
2725 } | 2670 } |
2726 TargetLowering *Target = Func->getTarget(); | 2671 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2727 Type Ty = Dest->getType(); | 2672 Type Ty = Dest->getType(); |
2728 if (!Dest->hasReg()) { | 2673 if (!Dest->hasReg()) { |
2729 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2674 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2730 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2675 Target->stackVarToAsmOperand(Dest)); |
2731 Target) | |
2732 ->stackVarToAsmOperand(Dest)); | |
2733 Asm->fstp(Ty, StackAddr); | 2676 Asm->fstp(Ty, StackAddr); |
2734 } else { | 2677 } else { |
2735 // Dest is a physical (xmm) register, so st(0) needs to go through memory. | 2678 // Dest is a physical (xmm) register, so st(0) needs to go through memory. |
2736 // Hack this by creating a temporary stack slot, spilling st(0) there, | 2679 // Hack this by creating a temporary stack slot, spilling st(0) there, |
2737 // loading it into the xmm register, and deallocating the stack slot. | 2680 // loading it into the xmm register, and deallocating the stack slot. |
2738 Immediate Width(typeWidthInBytes(Ty)); | 2681 Immediate Width(typeWidthInBytes(Ty)); |
2739 Asm->sub(IceType_i32, | 2682 Asm->sub(IceType_i32, |
2740 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); | 2683 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); |
2741 typename InstX86Base<Machine>::Traits::Address StackSlot = | 2684 typename InstX86Base<Machine>::Traits::Address StackSlot = |
2742 typename InstX86Base<Machine>::Traits::Address( | 2685 typename InstX86Base<Machine>::Traits::Address( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2784 this->emitTwoAddress(buf, this, Func); | 2727 this->emitTwoAddress(buf, this, Func); |
2785 } | 2728 } |
2786 | 2729 |
2787 template <class Machine> | 2730 template <class Machine> |
2788 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { | 2731 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { |
2789 if (!BuildDefs::dump()) | 2732 if (!BuildDefs::dump()) |
2790 return; | 2733 return; |
2791 Ostream &Str = Func->getContext()->getStrEmit(); | 2734 Ostream &Str = Func->getContext()->getStrEmit(); |
2792 assert(this->getSrcSize() == 2); | 2735 assert(this->getSrcSize() == 2); |
2793 // pextrb and pextrd are SSE4.1 instructions. | 2736 // pextrb and pextrd are SSE4.1 instructions. |
2794 TargetLowering *Target = Func->getTarget(); | 2737 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2795 (void)Target; | |
2796 assert(this->getSrc(0)->getType() == IceType_v8i16 || | 2738 assert(this->getSrc(0)->getType() == IceType_v8i16 || |
2797 this->getSrc(0)->getType() == IceType_v8i1 || | 2739 this->getSrc(0)->getType() == IceType_v8i1 || |
2798 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2740 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2799 Target) | |
2800 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
2801 Str << "\t" << this->Opcode | 2741 Str << "\t" << this->Opcode |
2802 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) | 2742 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) |
2803 ->getType()] | 2743 ->getType()] |
2804 .PackString << "\t"; | 2744 .PackString << "\t"; |
2805 this->getSrc(1)->emit(Func); | 2745 this->getSrc(1)->emit(Func); |
2806 Str << ", "; | 2746 Str << ", "; |
2807 this->getSrc(0)->emit(Func); | 2747 this->getSrc(0)->emit(Func); |
2808 Str << ", "; | 2748 Str << ", "; |
2809 Variable *Dest = this->getDest(); | 2749 Variable *Dest = this->getDest(); |
2810 // pextrw must take a register dest. There is an SSE4.1 version that takes a | 2750 // pextrw must take a register dest. There is an SSE4.1 version that takes a |
2811 // memory dest, but we aren't using it. For uniformity, just restrict them | 2751 // memory dest, but we aren't using it. For uniformity, just restrict them |
2812 // all to have a register dest for now. | 2752 // all to have a register dest for now. |
2813 assert(Dest->hasReg()); | 2753 assert(Dest->hasReg()); |
2814 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); | 2754 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); |
2815 } | 2755 } |
2816 | 2756 |
2817 template <class Machine> | 2757 template <class Machine> |
2818 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { | 2758 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { |
2819 assert(this->getSrcSize() == 2); | 2759 assert(this->getSrcSize() == 2); |
2820 // pextrb and pextrd are SSE4.1 instructions. | 2760 // pextrb and pextrd are SSE4.1 instructions. |
2821 const Variable *Dest = this->getDest(); | 2761 const Variable *Dest = this->getDest(); |
2822 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( | 2762 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( |
2823 this->getSrc(0)->getType()); | 2763 this->getSrc(0)->getType()); |
2824 TargetLowering *Target = Func->getTarget(); | 2764 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2825 (void)Target; | |
2826 assert(DispatchTy == IceType_i16 || | 2765 assert(DispatchTy == IceType_i16 || |
2827 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2766 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2828 Target) | |
2829 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
2830 // pextrw must take a register dest. There is an SSE4.1 version that takes a | 2767 // pextrw must take a register dest. There is an SSE4.1 version that takes a |
2831 // memory dest, but we aren't using it. For uniformity, just restrict them | 2768 // memory dest, but we aren't using it. For uniformity, just restrict them |
2832 // all to have a register dest for now. | 2769 // all to have a register dest for now. |
2833 assert(Dest->hasReg()); | 2770 assert(Dest->hasReg()); |
2834 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2). | 2771 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2). |
2835 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); | 2772 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); |
2836 static const typename InstX86Base<Machine>::Traits::Assembler:: | 2773 static const typename InstX86Base<Machine>::Traits::Assembler:: |
2837 template ThreeOpImmEmitter< | 2774 template ThreeOpImmEmitter< |
2838 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 2775 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
2839 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> | 2776 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> |
2840 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; | 2777 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; |
2841 emitIASThreeOpImmOps< | 2778 emitIASThreeOpImmOps< |
2842 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, | 2779 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
2843 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, | 2780 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
2844 InstX86Base<Machine>::Traits::getEncodedGPR, | 2781 InstX86Base<Machine>::Traits::getEncodedGPR, |
2845 InstX86Base<Machine>::Traits::getEncodedXmm>( | 2782 InstX86Base<Machine>::Traits::getEncodedXmm>( |
2846 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); | 2783 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
2847 } | 2784 } |
2848 | 2785 |
2849 template <class Machine> | 2786 template <class Machine> |
2850 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { | 2787 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { |
2851 if (!BuildDefs::dump()) | 2788 if (!BuildDefs::dump()) |
2852 return; | 2789 return; |
2853 Ostream &Str = Func->getContext()->getStrEmit(); | 2790 Ostream &Str = Func->getContext()->getStrEmit(); |
2854 assert(this->getSrcSize() == 3); | 2791 assert(this->getSrcSize() == 3); |
2855 // pinsrb and pinsrd are SSE4.1 instructions. | 2792 // pinsrb and pinsrd are SSE4.1 instructions. |
2856 TargetLowering *Target = Func->getTarget(); | 2793 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2857 (void)Target; | |
2858 assert(this->getDest()->getType() == IceType_v8i16 || | 2794 assert(this->getDest()->getType() == IceType_v8i16 || |
2859 this->getDest()->getType() == IceType_v8i1 || | 2795 this->getDest()->getType() == IceType_v8i1 || |
2860 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2796 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2861 Target) | |
2862 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
2863 Str << "\t" << this->Opcode | 2797 Str << "\t" << this->Opcode |
2864 << InstX86Base< | 2798 << InstX86Base< |
2865 Machine>::Traits::TypeAttributes[this->getDest()->getType()] | 2799 Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
2866 .PackString << "\t"; | 2800 .PackString << "\t"; |
2867 this->getSrc(2)->emit(Func); | 2801 this->getSrc(2)->emit(Func); |
2868 Str << ", "; | 2802 Str << ", "; |
2869 Operand *Src1 = this->getSrc(1); | 2803 Operand *Src1 = this->getSrc(1); |
2870 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { | 2804 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { |
2871 // If src1 is a register, it should always be r32. | 2805 // If src1 is a register, it should always be r32. |
2872 if (Src1Var->hasReg()) { | 2806 if (Src1Var->hasReg()) { |
(...skipping 11 matching lines...) Expand all Loading... |
2884 this->getDest()->emit(Func); | 2818 this->getDest()->emit(Func); |
2885 } | 2819 } |
2886 | 2820 |
2887 template <class Machine> | 2821 template <class Machine> |
2888 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { | 2822 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { |
2889 assert(this->getSrcSize() == 3); | 2823 assert(this->getSrcSize() == 3); |
2890 assert(this->getDest() == this->getSrc(0)); | 2824 assert(this->getDest() == this->getSrc(0)); |
2891 // pinsrb and pinsrd are SSE4.1 instructions. | 2825 // pinsrb and pinsrd are SSE4.1 instructions. |
2892 const Operand *Src0 = this->getSrc(1); | 2826 const Operand *Src0 = this->getSrc(1); |
2893 Type DispatchTy = Src0->getType(); | 2827 Type DispatchTy = Src0->getType(); |
2894 TargetLowering *Target = Func->getTarget(); | 2828 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2895 (void)Target; | |
2896 assert(DispatchTy == IceType_i16 || | 2829 assert(DispatchTy == IceType_i16 || |
2897 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2830 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); |
2898 Target) | |
2899 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); | |
2900 // If src1 is a register, it should always be r32 (this should fall out from | 2831 // If src1 is a register, it should always be r32 (this should fall out from |
2901 // the encodings for ByteRegs overlapping the encodings for r32), but we have | 2832 // the encodings for ByteRegs overlapping the encodings for r32), but we have |
2902 // to make sure the register allocator didn't choose an 8-bit high register | 2833 // to make sure the register allocator didn't choose an 8-bit high register |
2903 // like "ah". | 2834 // like "ah". |
2904 if (BuildDefs::asserts()) { | 2835 if (BuildDefs::asserts()) { |
2905 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { | 2836 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { |
2906 if (Src0Var->hasReg()) { | 2837 if (Src0Var->hasReg()) { |
2907 int32_t RegNum = Src0Var->getRegNum(); | 2838 int32_t RegNum = Src0Var->getRegNum(); |
2908 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); | 2839 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); |
2909 (void)BaseRegNum; | 2840 (void)BaseRegNum; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2976 | 2907 |
2977 template <class Machine> | 2908 template <class Machine> |
2978 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { | 2909 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { |
2979 assert(this->getSrcSize() == 0); | 2910 assert(this->getSrcSize() == 0); |
2980 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2911 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2981 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2912 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2982 if (this->getDest()->hasReg()) { | 2913 if (this->getDest()->hasReg()) { |
2983 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( | 2914 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( |
2984 this->getDest()->getRegNum())); | 2915 this->getDest()->getRegNum())); |
2985 } else { | 2916 } else { |
2986 TargetLowering *Target = Func->getTarget(); | 2917 auto *Target = InstX86Base<Machine>::getTarget(Func); |
2987 Asm->popl( | 2918 Asm->popl(Target->stackVarToAsmOperand(this->getDest())); |
2988 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
2989 Target) | |
2990 ->stackVarToAsmOperand(this->getDest())); | |
2991 } | 2919 } |
2992 } | 2920 } |
2993 | 2921 |
2994 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { | 2922 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { |
2995 if (!BuildDefs::dump()) | 2923 if (!BuildDefs::dump()) |
2996 return; | 2924 return; |
2997 Ostream &Str = Func->getContext()->getStrDump(); | 2925 Ostream &Str = Func->getContext()->getStrDump(); |
2998 this->dumpDest(Func); | 2926 this->dumpDest(Func); |
2999 Str << " = pop." << this->getDest()->getType() << " "; | 2927 Str << " = pop." << this->getDest()->getType() << " "; |
3000 } | 2928 } |
3001 | 2929 |
3002 template <class Machine> | 2930 template <class Machine> |
3003 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { | 2931 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { |
3004 if (!BuildDefs::dump()) | 2932 if (!BuildDefs::dump()) |
3005 return; | 2933 return; |
3006 Ostream &Str = Func->getContext()->getStrEmit(); | 2934 Ostream &Str = Func->getContext()->getStrEmit(); |
3007 Str << "\tsubl\t$" << Amount << ", %esp"; | 2935 Str << "\tsubl\t$" << Amount << ", %esp"; |
3008 TargetLowering *Target = Func->getTarget(); | 2936 auto *Target = InstX86Base<Machine>::getTarget(Func); |
3009 Target->updateStackAdjustment(Amount); | 2937 Target->updateStackAdjustment(Amount); |
3010 } | 2938 } |
3011 | 2939 |
3012 template <class Machine> | 2940 template <class Machine> |
3013 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { | 2941 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { |
3014 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2942 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3015 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2943 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
3016 Asm->sub(IceType_i32, | 2944 Asm->sub(IceType_i32, |
3017 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2945 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
3018 Immediate(Amount)); | 2946 Immediate(Amount)); |
3019 TargetLowering *Target = Func->getTarget(); | 2947 auto *Target = InstX86Base<Machine>::getTarget(Func); |
3020 Target->updateStackAdjustment(Amount); | 2948 Target->updateStackAdjustment(Amount); |
3021 } | 2949 } |
3022 | 2950 |
3023 template <class Machine> | 2951 template <class Machine> |
3024 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { | 2952 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { |
3025 if (!BuildDefs::dump()) | 2953 if (!BuildDefs::dump()) |
3026 return; | 2954 return; |
3027 Ostream &Str = Func->getContext()->getStrDump(); | 2955 Ostream &Str = Func->getContext()->getStrDump(); |
3028 Str << "esp = sub.i32 esp, " << Amount; | 2956 Str << "esp = sub.i32 esp, " << Amount; |
3029 } | 2957 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3140 this->Dest->emit(Func); | 3068 this->Dest->emit(Func); |
3141 } | 3069 } |
3142 | 3070 |
3143 template <class Machine> | 3071 template <class Machine> |
3144 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { | 3072 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { |
3145 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); | 3073 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); |
3146 assert(this->getDest()->getType() == IceType_i1); | 3074 assert(this->getDest()->getType() == IceType_i1); |
3147 assert(this->getSrcSize() == 0); | 3075 assert(this->getSrcSize() == 0); |
3148 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3076 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3149 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3077 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
3150 TargetLowering *Target = Func->getTarget(); | 3078 auto *Target = InstX86Base<Machine>::getTarget(Func); |
3151 if (this->getDest()->hasReg()) | 3079 if (this->getDest()->hasReg()) |
3152 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( | 3080 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( |
3153 this->getDest()->getRegNum())); | 3081 this->getDest()->getRegNum())); |
3154 else | 3082 else |
3155 Asm->setcc( | 3083 Asm->setcc(Condition, Target->stackVarToAsmOperand(this->getDest())); |
3156 Condition, | |
3157 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | |
3158 Target) | |
3159 ->stackVarToAsmOperand(this->getDest())); | |
3160 return; | 3084 return; |
3161 } | 3085 } |
3162 | 3086 |
3163 template <class Machine> | 3087 template <class Machine> |
3164 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { | 3088 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { |
3165 if (!BuildDefs::dump()) | 3089 if (!BuildDefs::dump()) |
3166 return; | 3090 return; |
3167 Ostream &Str = Func->getContext()->getStrDump(); | 3091 Ostream &Str = Func->getContext()->getStrDump(); |
3168 Str << "setcc." | 3092 Str << "setcc." |
3169 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString | 3093 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString |
(...skipping 19 matching lines...) Expand all Loading... |
3189 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { | 3113 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { |
3190 assert(this->getSrcSize() == 2); | 3114 assert(this->getSrcSize() == 2); |
3191 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3115 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3192 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3116 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
3193 Type Ty = this->getSrc(0)->getType(); | 3117 Type Ty = this->getSrc(0)->getType(); |
3194 const auto Mem = | 3118 const auto Mem = |
3195 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3119 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3196 this->getSrc(0)); | 3120 this->getSrc(0)); |
3197 assert(Mem->getSegmentRegister() == | 3121 assert(Mem->getSegmentRegister() == |
3198 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3122 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
3199 TargetLowering *Target = Func->getTarget(); | 3123 auto *Target = InstX86Base<Machine>::getTarget(Func); |
3200 const typename InstX86Base<Machine>::Traits::Address Addr = | 3124 const typename InstX86Base<Machine>::Traits::Address Addr = |
3201 Mem->toAsmAddress(Asm, Target); | 3125 Mem->toAsmAddress(Asm, Target); |
3202 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); | 3126 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); |
3203 assert(VarReg->hasReg()); | 3127 assert(VarReg->hasReg()); |
3204 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 3128 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
3205 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); | 3129 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
3206 Asm->xadd(Ty, Addr, Reg, this->Locked); | 3130 Asm->xadd(Ty, Addr, Reg, this->Locked); |
3207 } | 3131 } |
3208 | 3132 |
3209 template <class Machine> | 3133 template <class Machine> |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3247 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); | 3171 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); |
3248 Asm->xchg(Ty, Reg0, Reg1); | 3172 Asm->xchg(Ty, Reg0, Reg1); |
3249 return; | 3173 return; |
3250 } | 3174 } |
3251 | 3175 |
3252 const auto *Mem = | 3176 const auto *Mem = |
3253 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3177 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3254 this->getSrc(0)); | 3178 this->getSrc(0)); |
3255 assert(Mem->getSegmentRegister() == | 3179 assert(Mem->getSegmentRegister() == |
3256 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3180 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
3257 TargetLowering *Target = Func->getTarget(); | 3181 auto *Target = InstX86Base<Machine>::getTarget(Func); |
3258 const typename InstX86Base<Machine>::Traits::Address Addr = | 3182 const typename InstX86Base<Machine>::Traits::Address Addr = |
3259 Mem->toAsmAddress(Asm, Target); | 3183 Mem->toAsmAddress(Asm, Target); |
3260 Asm->xchg(Ty, Addr, Reg1); | 3184 Asm->xchg(Ty, Addr, Reg1); |
3261 } | 3185 } |
3262 | 3186 |
3263 template <class Machine> | 3187 template <class Machine> |
3264 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { | 3188 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { |
3265 if (!BuildDefs::dump()) | 3189 if (!BuildDefs::dump()) |
3266 return; | 3190 return; |
3267 Ostream &Str = Func->getContext()->getStrDump(); | 3191 Ostream &Str = Func->getContext()->getStrDump(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3320 return; | 3244 return; |
3321 Ostream &Str = Func->getContext()->getStrDump(); | 3245 Ostream &Str = Func->getContext()->getStrDump(); |
3322 Str << "IACA_END"; | 3246 Str << "IACA_END"; |
3323 } | 3247 } |
3324 | 3248 |
3325 } // end of namespace X86Internal | 3249 } // end of namespace X86Internal |
3326 | 3250 |
3327 } // end of namespace Ice | 3251 } // end of namespace Ice |
3328 | 3252 |
3329 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H | 3253 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H |
OLD | NEW |