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 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
579 Str << "*"; | 579 Str << "*"; |
580 getCallTarget()->emit(Func); | 580 getCallTarget()->emit(Func); |
581 } | 581 } |
582 Func->getTarget()->resetStackAdjustment(); | 582 Func->getTarget()->resetStackAdjustment(); |
583 } | 583 } |
584 | 584 |
585 template <class Machine> | 585 template <class Machine> |
586 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { | 586 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { |
587 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 587 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
588 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 588 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
589 Operand *Target = getCallTarget(); | 589 Operand *Target = getCallTarget(); |
Jim Stichnoth
2015/11/11 17:39:45
Rename this to CallTarget, and do
TargetLowering
sehr
2015/11/11 22:14:10
I went globally through this file. There are some
| |
590 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { | 590 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { |
591 if (Var->hasReg()) { | 591 if (Var->hasReg()) { |
592 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); | 592 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
593 } else { | 593 } else { |
594 Asm->call( | 594 Asm->call( |
595 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 595 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
596 Func->getTarget()) | 596 Func->getTarget()) |
597 ->stackVarToAsmOperand(Var)); | 597 ->stackVarToAsmOperand(Var)); |
598 } | 598 } |
599 } else if (const auto *Mem = llvm::dyn_cast< | 599 } else if (const auto *Mem = llvm::dyn_cast< |
600 typename InstX86Base<Machine>::Traits::X86OperandMem>( | 600 typename InstX86Base<Machine>::Traits::X86OperandMem>( |
601 Target)) { | 601 Target)) { |
602 assert(Mem->getSegmentRegister() == | 602 assert(Mem->getSegmentRegister() == |
603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
604 Asm->call(Mem->toAsmAddress(Asm)); | 604 Asm->call(Mem->toAsmAddress(Asm, Func->getTarget())); |
605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { | 605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { |
606 assert(CR->getOffset() == 0 && "We only support calling a function"); | 606 assert(CR->getOffset() == 0 && "We only support calling a function"); |
607 Asm->call(CR); | 607 Asm->call(CR); |
608 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { | 608 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { |
609 Asm->call(Immediate(Imm->getValue())); | 609 Asm->call(Immediate(Imm->getValue())); |
610 } else { | 610 } else { |
611 llvm_unreachable("Unexpected operand type"); | 611 llvm_unreachable("Unexpected operand type"); |
612 } | 612 } |
613 Func->getTarget()->resetStackAdjustment(); | 613 Func->getTarget()->resetStackAdjustment(); |
614 } | 614 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 } else { | 662 } else { |
663 typename InstX86Base<Machine>::Traits::Address StackAddr( | 663 typename InstX86Base<Machine>::Traits::Address StackAddr( |
664 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 664 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
665 Func->getTarget()) | 665 Func->getTarget()) |
666 ->stackVarToAsmOperand(Var)); | 666 ->stackVarToAsmOperand(Var)); |
667 (Asm->*(Emitter.Addr))(Ty, StackAddr); | 667 (Asm->*(Emitter.Addr))(Ty, StackAddr); |
668 } | 668 } |
669 } else if (const auto *Mem = llvm::dyn_cast< | 669 } else if (const auto *Mem = llvm::dyn_cast< |
670 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { | 670 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { |
671 Mem->emitSegmentOverride(Asm); | 671 Mem->emitSegmentOverride(Asm); |
672 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm)); | 672 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Func->getTarget())); |
673 } else { | 673 } else { |
674 llvm_unreachable("Unexpected operand type"); | 674 llvm_unreachable("Unexpected operand type"); |
675 } | 675 } |
676 } | 676 } |
677 | 677 |
678 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> | 678 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> |
679 void emitIASRegOpTyGPR( | 679 void emitIASRegOpTyGPR( |
680 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 680 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
681 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp | 681 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp |
682 &Emitter) { | 682 &Emitter) { |
(...skipping 16 matching lines...) Expand all Loading... | |
699 } else { | 699 } else { |
700 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 700 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
701 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 701 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
702 Func->getTarget()) | 702 Func->getTarget()) |
703 ->stackVarToAsmOperand(SrcVar); | 703 ->stackVarToAsmOperand(SrcVar); |
704 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); | 704 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); |
705 } | 705 } |
706 } else if (const auto *Mem = llvm::dyn_cast< | 706 } else if (const auto *Mem = llvm::dyn_cast< |
707 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 707 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
708 Mem->emitSegmentOverride(Asm); | 708 Mem->emitSegmentOverride(Asm); |
709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, |
710 Mem->toAsmAddress(Asm, Func->getTarget())); | |
710 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 711 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
711 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); | 712 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); |
712 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { | 713 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
713 AssemblerFixup *Fixup = | 714 AssemblerFixup *Fixup = |
714 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); | 715 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); |
715 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); | 716 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); |
716 } else if (const auto *Split = llvm::dyn_cast< | 717 } else if (const auto *Split = llvm::dyn_cast< |
717 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { | 718 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { |
718 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); | 719 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); |
719 } else { | 720 } else { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
757 typename InstX86Base<Machine>::Traits::Address StackAddr( | 758 typename InstX86Base<Machine>::Traits::Address StackAddr( |
758 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 759 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
759 Func->getTarget()) | 760 Func->getTarget()) |
760 ->stackVarToAsmOperand(Op0Var)); | 761 ->stackVarToAsmOperand(Op0Var)); |
761 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); | 762 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); |
762 } else if (const auto *Op0Mem = llvm::dyn_cast< | 763 } else if (const auto *Op0Mem = llvm::dyn_cast< |
763 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { | 764 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { |
764 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 765 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
765 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 766 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
766 Op0Mem->emitSegmentOverride(Asm); | 767 Op0Mem->emitSegmentOverride(Asm); |
767 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm), Op1, | 768 emitIASAddrOpTyGPR<Machine>( |
768 Emitter); | 769 Func, Ty, Op0Mem->toAsmAddress(Asm, Func->getTarget()), Op1, Emitter); |
769 } else if (const auto *Split = llvm::dyn_cast< | 770 } else if (const auto *Split = llvm::dyn_cast< |
770 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { | 771 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { |
771 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, | 772 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, |
772 Emitter); | 773 Emitter); |
773 } else { | 774 } else { |
774 llvm_unreachable("Unexpected operand type"); | 775 llvm_unreachable("Unexpected operand type"); |
775 } | 776 } |
776 } | 777 } |
777 | 778 |
778 template <class Machine> | 779 template <class Machine> |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
849 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 850 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
850 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 851 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
851 Func->getTarget()) | 852 Func->getTarget()) |
852 ->stackVarToAsmOperand(SrcVar); | 853 ->stackVarToAsmOperand(SrcVar); |
853 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 854 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
854 } | 855 } |
855 } else if (const auto *Mem = llvm::dyn_cast< | 856 } else if (const auto *Mem = llvm::dyn_cast< |
856 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 857 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
857 assert(Mem->getSegmentRegister() == | 858 assert(Mem->getSegmentRegister() == |
858 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 859 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
859 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 860 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, |
861 Mem->toAsmAddress(Asm, Func->getTarget())); | |
860 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { | 862 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
861 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); | 863 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); |
862 } else { | 864 } else { |
863 llvm_unreachable("Unexpected operand type"); | 865 llvm_unreachable("Unexpected operand type"); |
864 } | 866 } |
865 } | 867 } |
866 | 868 |
867 template <class Machine> | 869 template <class Machine> |
868 void emitIASRegOpTyXMM( | 870 void emitIASRegOpTyXMM( |
869 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 871 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
(...skipping 13 matching lines...) Expand all Loading... | |
883 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 885 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
884 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 886 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
885 Func->getTarget()) | 887 Func->getTarget()) |
886 ->stackVarToAsmOperand(SrcVar); | 888 ->stackVarToAsmOperand(SrcVar); |
887 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); | 889 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
888 } | 890 } |
889 } else if (const auto *Mem = llvm::dyn_cast< | 891 } else if (const auto *Mem = llvm::dyn_cast< |
890 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 892 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
891 assert(Mem->getSegmentRegister() == | 893 assert(Mem->getSegmentRegister() == |
892 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 894 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
893 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); | 895 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, |
896 Mem->toAsmAddress(Asm, Func->getTarget())); | |
894 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 897 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
895 (Asm->*(Emitter.XmmAddr))( | 898 (Asm->*(Emitter.XmmAddr))( |
896 Ty, VarReg, | 899 Ty, VarReg, |
897 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 900 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
898 } else { | 901 } else { |
899 llvm_unreachable("Unexpected operand type"); | 902 llvm_unreachable("Unexpected operand type"); |
900 } | 903 } |
901 } | 904 } |
902 | 905 |
903 template <class Machine, typename DReg_t, typename SReg_t, | 906 template <class Machine, typename DReg_t, typename SReg_t, |
(...skipping 13 matching lines...) Expand all Loading... | |
917 } else { | 920 } else { |
918 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 921 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
919 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 922 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
920 Func->getTarget()) | 923 Func->getTarget()) |
921 ->stackVarToAsmOperand(SrcVar); | 924 ->stackVarToAsmOperand(SrcVar); |
922 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); | 925 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); |
923 } | 926 } |
924 } else if (const auto *Mem = llvm::dyn_cast< | 927 } else if (const auto *Mem = llvm::dyn_cast< |
925 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 928 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
926 Mem->emitSegmentOverride(Asm); | 929 Mem->emitSegmentOverride(Asm); |
927 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, Mem->toAsmAddress(Asm)); | 930 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, |
931 Mem->toAsmAddress(Asm, Func->getTarget())); | |
928 } else { | 932 } else { |
929 llvm_unreachable("Unexpected operand type"); | 933 llvm_unreachable("Unexpected operand type"); |
930 } | 934 } |
931 } | 935 } |
932 | 936 |
933 template <class Machine, typename DReg_t, typename SReg_t, | 937 template <class Machine, typename DReg_t, typename SReg_t, |
934 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> | 938 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> |
935 void emitIASThreeOpImmOps( | 939 void emitIASThreeOpImmOps( |
936 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, | 940 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, |
937 const Operand *Src1, | 941 const Operand *Src1, |
(...skipping 12 matching lines...) Expand all Loading... | |
950 } else { | 954 } else { |
951 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = | 955 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
952 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 956 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
953 Func->getTarget()) | 957 Func->getTarget()) |
954 ->stackVarToAsmOperand(SrcVar); | 958 ->stackVarToAsmOperand(SrcVar); |
955 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); | 959 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); |
956 } | 960 } |
957 } else if (const auto *Mem = llvm::dyn_cast< | 961 } else if (const auto *Mem = llvm::dyn_cast< |
958 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { | 962 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { |
959 Mem->emitSegmentOverride(Asm); | 963 Mem->emitSegmentOverride(Asm); |
960 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, Mem->toAsmAddress(Asm), | 964 (Asm->*(Emitter.RegAddrImm))( |
961 Imm); | 965 DispatchTy, DestReg, Mem->toAsmAddress(Asm, Func->getTarget()), Imm); |
962 } else { | 966 } else { |
963 llvm_unreachable("Unexpected operand type"); | 967 llvm_unreachable("Unexpected operand type"); |
964 } | 968 } |
965 } | 969 } |
966 | 970 |
967 template <class Machine> | 971 template <class Machine> |
968 void emitIASMovlikeXMM( | 972 void emitIASMovlikeXMM( |
969 const Cfg *Func, const Variable *Dest, const Operand *Src, | 973 const Cfg *Func, const Variable *Dest, const Operand *Src, |
970 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps | 974 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps |
971 Emitter) { | 975 Emitter) { |
(...skipping 11 matching lines...) Expand all Loading... | |
983 typename InstX86Base<Machine>::Traits::Address StackAddr( | 987 typename InstX86Base<Machine>::Traits::Address StackAddr( |
984 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering | 988 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering |
985 *>(Func->getTarget()) | 989 *>(Func->getTarget()) |
986 ->stackVarToAsmOperand(SrcVar)); | 990 ->stackVarToAsmOperand(SrcVar)); |
987 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); | 991 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); |
988 } | 992 } |
989 } else if (const auto *SrcMem = llvm::dyn_cast< | 993 } else if (const auto *SrcMem = llvm::dyn_cast< |
990 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 994 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
991 assert(SrcMem->getSegmentRegister() == | 995 assert(SrcMem->getSegmentRegister() == |
992 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 996 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
993 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm)); | 997 (Asm->*(Emitter.XmmAddr))(DestReg, |
998 SrcMem->toAsmAddress(Asm, Func->getTarget())); | |
994 } else { | 999 } else { |
995 llvm_unreachable("Unexpected operand type"); | 1000 llvm_unreachable("Unexpected operand type"); |
996 } | 1001 } |
997 } else { | 1002 } else { |
998 typename InstX86Base<Machine>::Traits::Address StackAddr( | 1003 typename InstX86Base<Machine>::Traits::Address StackAddr( |
999 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1004 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1000 Func->getTarget()) | 1005 Func->getTarget()) |
1001 ->stackVarToAsmOperand(Dest)); | 1006 ->stackVarToAsmOperand(Dest)); |
1002 // Src must be a register in this case. | 1007 // Src must be a register in this case. |
1003 const auto *SrcVar = llvm::cast<Variable>(Src); | 1008 const auto *SrcVar = llvm::cast<Variable>(Src); |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1618 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 1623 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
1619 Func->getTarget()) | 1624 Func->getTarget()) |
1620 ->stackVarToAsmOperand(SrcVar)); | 1625 ->stackVarToAsmOperand(SrcVar)); |
1621 } | 1626 } |
1622 } else if (const auto *Mem = llvm::dyn_cast< | 1627 } else if (const auto *Mem = llvm::dyn_cast< |
1623 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 1628 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
1624 assert(Mem->getSegmentRegister() == | 1629 assert(Mem->getSegmentRegister() == |
1625 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1630 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1626 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1631 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
1627 this->getDest()->getRegNum()), | 1632 this->getDest()->getRegNum()), |
1628 Mem->toAsmAddress(Asm)); | 1633 Mem->toAsmAddress(Asm, Func->getTarget())); |
1629 } else { | 1634 } else { |
1630 llvm_unreachable("Unexpected operand type"); | 1635 llvm_unreachable("Unexpected operand type"); |
1631 } | 1636 } |
1632 } | 1637 } |
1633 | 1638 |
1634 template <class Machine> | 1639 template <class Machine> |
1635 void InstX86Cmov<Machine>::dump(const Cfg *Func) const { | 1640 void InstX86Cmov<Machine>::dump(const Cfg *Func) const { |
1636 if (!BuildDefs::dump()) | 1641 if (!BuildDefs::dump()) |
1637 return; | 1642 return; |
1638 Ostream &Str = Func->getContext()->getStrDump(); | 1643 Ostream &Str = Func->getContext()->getStrDump(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1723 assert(this->getSrcSize() == 3); | 1728 assert(this->getSrcSize() == 3); |
1724 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1729 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1725 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1730 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1726 Type Ty = this->getSrc(0)->getType(); | 1731 Type Ty = this->getSrc(0)->getType(); |
1727 const auto Mem = | 1732 const auto Mem = |
1728 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1733 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1729 this->getSrc(0)); | 1734 this->getSrc(0)); |
1730 assert(Mem->getSegmentRegister() == | 1735 assert(Mem->getSegmentRegister() == |
1731 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1736 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1732 const typename InstX86Base<Machine>::Traits::Address Addr = | 1737 const typename InstX86Base<Machine>::Traits::Address Addr = |
1733 Mem->toAsmAddress(Asm); | 1738 Mem->toAsmAddress(Asm, Func->getTarget()); |
1734 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); | 1739 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); |
1735 assert(VarReg->hasReg()); | 1740 assert(VarReg->hasReg()); |
1736 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 1741 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
1737 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); | 1742 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
1738 Asm->cmpxchg(Ty, Addr, Reg, this->Locked); | 1743 Asm->cmpxchg(Ty, Addr, Reg, this->Locked); |
1739 } | 1744 } |
1740 | 1745 |
1741 template <class Machine> | 1746 template <class Machine> |
1742 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const { | 1747 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const { |
1743 if (!BuildDefs::dump()) | 1748 if (!BuildDefs::dump()) |
(...skipping 23 matching lines...) Expand all Loading... | |
1767 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { | 1772 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { |
1768 assert(this->getSrcSize() == 5); | 1773 assert(this->getSrcSize() == 5); |
1769 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1774 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
1770 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1775 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
1771 const auto Mem = | 1776 const auto Mem = |
1772 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 1777 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
1773 this->getSrc(0)); | 1778 this->getSrc(0)); |
1774 assert(Mem->getSegmentRegister() == | 1779 assert(Mem->getSegmentRegister() == |
1775 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1780 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
1776 const typename InstX86Base<Machine>::Traits::Address Addr = | 1781 const typename InstX86Base<Machine>::Traits::Address Addr = |
1777 Mem->toAsmAddress(Asm); | 1782 Mem->toAsmAddress(Asm, Func->getTarget()); |
1778 Asm->cmpxchg8b(Addr, this->Locked); | 1783 Asm->cmpxchg8b(Addr, this->Locked); |
1779 } | 1784 } |
1780 | 1785 |
1781 template <class Machine> | 1786 template <class Machine> |
1782 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { | 1787 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { |
1783 if (!BuildDefs::dump()) | 1788 if (!BuildDefs::dump()) |
1784 return; | 1789 return; |
1785 Ostream &Str = Func->getContext()->getStrDump(); | 1790 Ostream &Str = Func->getContext()->getStrDump(); |
1786 if (this->Locked) { | 1791 if (this->Locked) { |
1787 Str << "lock "; | 1792 Str << "lock "; |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2120 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2125 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2121 Func->getTarget()) | 2126 Func->getTarget()) |
2122 ->stackVarToAsmOperand(DestVar)); | 2127 ->stackVarToAsmOperand(DestVar)); |
2123 Asm->movss(DestTy, StackAddr, SrcReg); | 2128 Asm->movss(DestTy, StackAddr, SrcReg); |
2124 } else { | 2129 } else { |
2125 const auto DestMem = | 2130 const auto DestMem = |
2126 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2131 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2127 Dest); | 2132 Dest); |
2128 assert(DestMem->getSegmentRegister() == | 2133 assert(DestMem->getSegmentRegister() == |
2129 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2134 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2130 Asm->movss(DestTy, DestMem->toAsmAddress(Asm), SrcReg); | 2135 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Func->getTarget()), SrcReg); |
2131 } | 2136 } |
2132 return; | 2137 return; |
2133 } else { | 2138 } else { |
2134 assert(isScalarIntegerType(DestTy)); | 2139 assert(isScalarIntegerType(DestTy)); |
2135 static const typename InstX86Base< | 2140 static const typename InstX86Base< |
2136 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { | 2141 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { |
2137 &InstX86Base<Machine>::Traits::Assembler::mov, | 2142 &InstX86Base<Machine>::Traits::Assembler::mov, |
2138 &InstX86Base<Machine>::Traits::Assembler::mov}; | 2143 &InstX86Base<Machine>::Traits::Assembler::mov}; |
2139 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter); | 2144 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter); |
2140 } | 2145 } |
(...skipping 28 matching lines...) Expand all Loading... | |
2169 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2174 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2170 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2175 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2171 assert(this->getSrcSize() == 2); | 2176 assert(this->getSrcSize() == 2); |
2172 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2177 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2173 const auto DestMem = | 2178 const auto DestMem = |
2174 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2179 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2175 this->getSrc(1)); | 2180 this->getSrc(1)); |
2176 assert(DestMem->getSegmentRegister() == | 2181 assert(DestMem->getSegmentRegister() == |
2177 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2182 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2178 assert(SrcVar->hasReg()); | 2183 assert(SrcVar->hasReg()); |
2179 Asm->movups(DestMem->toAsmAddress(Asm), | 2184 Asm->movups(DestMem->toAsmAddress(Asm, Func->getTarget()), |
2180 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2185 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2181 } | 2186 } |
2182 | 2187 |
2183 template <class Machine> | 2188 template <class Machine> |
2184 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { | 2189 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { |
2185 if (!BuildDefs::dump()) | 2190 if (!BuildDefs::dump()) |
2186 return; | 2191 return; |
2187 Ostream &Str = Func->getContext()->getStrDump(); | 2192 Ostream &Str = Func->getContext()->getStrDump(); |
2188 Str << "storep." << this->getSrc(0)->getType() << " "; | 2193 Str << "storep." << this->getSrc(0)->getType() << " "; |
2189 this->getSrc(1)->dump(Func); | 2194 this->getSrc(1)->dump(Func); |
(...skipping 21 matching lines...) Expand all Loading... | |
2211 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2216 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
2212 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2217 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
2213 assert(this->getSrcSize() == 2); | 2218 assert(this->getSrcSize() == 2); |
2214 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); | 2219 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
2215 const auto DestMem = | 2220 const auto DestMem = |
2216 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 2221 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
2217 this->getSrc(1)); | 2222 this->getSrc(1)); |
2218 assert(DestMem->getSegmentRegister() == | 2223 assert(DestMem->getSegmentRegister() == |
2219 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2224 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2220 assert(SrcVar->hasReg()); | 2225 assert(SrcVar->hasReg()); |
2221 Asm->movq(DestMem->toAsmAddress(Asm), | 2226 Asm->movq(DestMem->toAsmAddress(Asm, Func->getTarget()), |
2222 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); | 2227 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
2223 } | 2228 } |
2224 | 2229 |
2225 template <class Machine> | 2230 template <class Machine> |
2226 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { | 2231 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { |
2227 if (!BuildDefs::dump()) | 2232 if (!BuildDefs::dump()) |
2228 return; | 2233 return; |
2229 Ostream &Str = Func->getContext()->getStrDump(); | 2234 Ostream &Str = Func->getContext()->getStrDump(); |
2230 Str << "storeq." << this->getSrc(0)->getType() << " "; | 2235 Str << "storeq." << this->getSrc(0)->getType() << " "; |
2231 this->getSrc(1)->dump(Func); | 2236 this->getSrc(1)->dump(Func); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2618 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2623 typename InstX86Base<Machine>::Traits::Address StackAddr( |
2619 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( | 2624 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
2620 Func->getTarget()) | 2625 Func->getTarget()) |
2621 ->stackVarToAsmOperand(Var)); | 2626 ->stackVarToAsmOperand(Var)); |
2622 Asm->fld(Ty, StackAddr); | 2627 Asm->fld(Ty, StackAddr); |
2623 } | 2628 } |
2624 } else if (const auto *Mem = llvm::dyn_cast< | 2629 } else if (const auto *Mem = llvm::dyn_cast< |
2625 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 2630 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
2626 assert(Mem->getSegmentRegister() == | 2631 assert(Mem->getSegmentRegister() == |
2627 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 2632 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
2628 Asm->fld(Ty, Mem->toAsmAddress(Asm)); | 2633 Asm->fld(Ty, Mem->toAsmAddress(Asm, Func->getTarget())); |
2629 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { | 2634 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
2630 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); | 2635 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
2631 } else { | 2636 } else { |
2632 llvm_unreachable("Unexpected operand type"); | 2637 llvm_unreachable("Unexpected operand type"); |
2633 } | 2638 } |
2634 } | 2639 } |
2635 | 2640 |
2636 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const { | 2641 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const { |
2637 if (!BuildDefs::dump()) | 2642 if (!BuildDefs::dump()) |
2638 return; | 2643 return; |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3142 assert(this->getSrcSize() == 2); | 3147 assert(this->getSrcSize() == 2); |
3143 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 3148 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
3144 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 3149 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
3145 Type Ty = this->getSrc(0)->getType(); | 3150 Type Ty = this->getSrc(0)->getType(); |
3146 const auto Mem = | 3151 const auto Mem = |
3147 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3152 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3148 this->getSrc(0)); | 3153 this->getSrc(0)); |
3149 assert(Mem->getSegmentRegister() == | 3154 assert(Mem->getSegmentRegister() == |
3150 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3155 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
3151 const typename InstX86Base<Machine>::Traits::Address Addr = | 3156 const typename InstX86Base<Machine>::Traits::Address Addr = |
3152 Mem->toAsmAddress(Asm); | 3157 Mem->toAsmAddress(Asm, Func->getTarget()); |
3153 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); | 3158 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); |
3154 assert(VarReg->hasReg()); | 3159 assert(VarReg->hasReg()); |
3155 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = | 3160 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
3156 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); | 3161 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
3157 Asm->xadd(Ty, Addr, Reg, this->Locked); | 3162 Asm->xadd(Ty, Addr, Reg, this->Locked); |
3158 } | 3163 } |
3159 | 3164 |
3160 template <class Machine> | 3165 template <class Machine> |
3161 void InstX86Xadd<Machine>::dump(const Cfg *Func) const { | 3166 void InstX86Xadd<Machine>::dump(const Cfg *Func) const { |
3162 if (!BuildDefs::dump()) | 3167 if (!BuildDefs::dump()) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3199 Asm->xchg(Ty, Reg0, Reg1); | 3204 Asm->xchg(Ty, Reg0, Reg1); |
3200 return; | 3205 return; |
3201 } | 3206 } |
3202 | 3207 |
3203 const auto *Mem = | 3208 const auto *Mem = |
3204 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( | 3209 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
3205 this->getSrc(0)); | 3210 this->getSrc(0)); |
3206 assert(Mem->getSegmentRegister() == | 3211 assert(Mem->getSegmentRegister() == |
3207 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 3212 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
3208 const typename InstX86Base<Machine>::Traits::Address Addr = | 3213 const typename InstX86Base<Machine>::Traits::Address Addr = |
3209 Mem->toAsmAddress(Asm); | 3214 Mem->toAsmAddress(Asm, Func->getTarget()); |
3210 Asm->xchg(Ty, Addr, Reg1); | 3215 Asm->xchg(Ty, Addr, Reg1); |
3211 } | 3216 } |
3212 | 3217 |
3213 template <class Machine> | 3218 template <class Machine> |
3214 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { | 3219 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { |
3215 if (!BuildDefs::dump()) | 3220 if (!BuildDefs::dump()) |
3216 return; | 3221 return; |
3217 Ostream &Str = Func->getContext()->getStrDump(); | 3222 Ostream &Str = Func->getContext()->getStrDump(); |
3218 Type Ty = this->getSrc(0)->getType(); | 3223 Type Ty = this->getSrc(0)->getType(); |
3219 Str << "xchg." << Ty << " "; | 3224 Str << "xchg." << Ty << " "; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3270 return; | 3275 return; |
3271 Ostream &Str = Func->getContext()->getStrDump(); | 3276 Ostream &Str = Func->getContext()->getStrDump(); |
3272 Str << "IACA_END"; | 3277 Str << "IACA_END"; |
3273 } | 3278 } |
3274 | 3279 |
3275 } // end of namespace X86Internal | 3280 } // end of namespace X86Internal |
3276 | 3281 |
3277 } // end of namespace Ice | 3282 } // end of namespace Ice |
3278 | 3283 |
3279 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H | 3284 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H |
OLD | NEW |