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

Side by Side Diff: src/IceInstX86BaseImpl.h

Issue 1411583007: Combine allocas (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix a typo. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=// 1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698