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

Side by Side Diff: src/IceInstX86BaseImpl.h

Issue 1438933002: Add a getTarget method that returns the x86 target lowering (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: 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
« no previous file with comments | « src/IceInstX86Base.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 = this->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 = this->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
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);
John 2015/11/12 00:54:03 You have some versions saying this->, and some say
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
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
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
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 = this->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 = this->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
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 = this->getTarget(Func);
1240 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1215 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1241 Target)
1242 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1243 emitVariableBlendInst<Machine>(this->Opcode, this, Func); 1216 emitVariableBlendInst<Machine>(this->Opcode, this, Func);
1244 } 1217 }
1245 1218
1246 template <class Machine> 1219 template <class Machine>
1247 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { 1220 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const {
1248 TargetLowering *Target = Func->getTarget(); 1221 auto *Target = this->getTarget(Func);
1249 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1222 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1250 Target)
1251 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1252 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp 1223 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
1253 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, 1224 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
1254 &InstX86Base<Machine>::Traits::Assembler::blendvps}; 1225 &InstX86Base<Machine>::Traits::Assembler::blendvps};
1255 emitIASVariableBlendInst<Machine>(this, Func, Emitter); 1226 emitIASVariableBlendInst<Machine>(this, Func, Emitter);
1256 } 1227 }
1257 1228
1258 template <class Machine> 1229 template <class Machine>
1259 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { 1230 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
1260 if (!BuildDefs::dump()) 1231 if (!BuildDefs::dump())
1261 return; 1232 return;
1262 TargetLowering *Target = Func->getTarget(); 1233 auto *Target = this->getTarget(Func);
1263 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1234 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1264 Target)
1265 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1266 emitVariableBlendInst<Machine>(this->Opcode, this, Func); 1235 emitVariableBlendInst<Machine>(this->Opcode, this, Func);
1267 } 1236 }
1268 1237
1269 template <class Machine> 1238 template <class Machine>
1270 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { 1239 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const {
1271 TargetLowering *Target = Func->getTarget(); 1240 auto *Target = this->getTarget(Func);
1272 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1241 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1273 Target)
1274 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1275 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp 1242 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
1276 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, 1243 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
1277 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; 1244 &InstX86Base<Machine>::Traits::Assembler::pblendvb};
1278 emitIASVariableBlendInst<Machine>(this, Func, Emitter); 1245 emitIASVariableBlendInst<Machine>(this, Func, Emitter);
1279 } 1246 }
1280 1247
1281 template <class Machine> 1248 template <class Machine>
1282 void InstX86Imul<Machine>::emit(const Cfg *Func) const { 1249 void InstX86Imul<Machine>::emit(const Cfg *Func) const {
1283 if (!BuildDefs::dump()) 1250 if (!BuildDefs::dump())
1284 return; 1251 return;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 1335 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
1369 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 1336 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
1370 InstX86Base<Machine>::Traits::getEncodedGPR, 1337 InstX86Base<Machine>::Traits::getEncodedGPR,
1371 InstX86Base<Machine>::Traits::getEncodedGPR>( 1338 InstX86Base<Machine>::Traits::getEncodedGPR>(
1372 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); 1339 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter);
1373 } 1340 }
1374 1341
1375 template <class Machine> 1342 template <class Machine>
1376 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { 1343 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const {
1377 assert(this->getSrcSize() == 3); 1344 assert(this->getSrcSize() == 3);
1378 TargetLowering *Target = Func->getTarget(); 1345 auto *Target = this->getTarget(Func);
1379 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1346 assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1380 Target)
1381 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1382 const Variable *Dest = this->getDest(); 1347 const Variable *Dest = this->getDest();
1383 assert(Dest == this->getSrc(0)); 1348 assert(Dest == this->getSrc(0));
1384 Type Ty = Dest->getType(); 1349 Type Ty = Dest->getType();
1385 static const typename InstX86Base<Machine>::Traits::Assembler:: 1350 static const typename InstX86Base<Machine>::Traits::Assembler::
1386 template ThreeOpImmEmitter< 1351 template ThreeOpImmEmitter<
1387 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, 1352 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister,
1388 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> 1353 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister>
1389 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, 1354 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps,
1390 &InstX86Base<Machine>::Traits::Assembler::insertps}; 1355 &InstX86Base<Machine>::Traits::Assembler::insertps};
1391 emitIASThreeOpImmOps< 1356 emitIASThreeOpImmOps<
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1617 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { 1582 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const {
1618 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); 1583 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None);
1619 assert(this->getDest()->hasReg()); 1584 assert(this->getDest()->hasReg());
1620 assert(this->getSrcSize() == 2); 1585 assert(this->getSrcSize() == 2);
1621 Operand *Src = this->getSrc(1); 1586 Operand *Src = this->getSrc(1);
1622 Type SrcTy = Src->getType(); 1587 Type SrcTy = Src->getType();
1623 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || 1588 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 ||
1624 (InstX86Base<Machine>::Traits::Is64Bit)); 1589 (InstX86Base<Machine>::Traits::Is64Bit));
1625 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1590 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1626 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1591 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1627 TargetLowering *Target = Func->getTarget(); 1592 auto *Target = this->getTarget(Func);
1628 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 1593 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
1629 if (SrcVar->hasReg()) { 1594 if (SrcVar->hasReg()) {
1630 Asm->cmov( 1595 Asm->cmov(
1631 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1596 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1632 this->getDest()->getRegNum()), 1597 this->getDest()->getRegNum()),
1633 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 1598 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
1634 } else { 1599 } else {
1635 Asm->cmov( 1600 Asm->cmov(
1636 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1601 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1637 this->getDest()->getRegNum()), 1602 this->getDest()->getRegNum()),
1638 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1603 Target->stackVarToAsmOperand(SrcVar));
1639 Target)
1640 ->stackVarToAsmOperand(SrcVar));
1641 } 1604 }
1642 } else if (const auto *Mem = llvm::dyn_cast< 1605 } else if (const auto *Mem = llvm::dyn_cast<
1643 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 1606 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
1644 assert(Mem->getSegmentRegister() == 1607 assert(Mem->getSegmentRegister() ==
1645 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1608 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1646 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1609 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1647 this->getDest()->getRegNum()), 1610 this->getDest()->getRegNum()),
1648 Mem->toAsmAddress(Asm, Target)); 1611 Mem->toAsmAddress(Asm, Target));
1649 } else { 1612 } else {
1650 llvm_unreachable("Unexpected operand type"); 1613 llvm_unreachable("Unexpected operand type");
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1684 1647
1685 template <class Machine> 1648 template <class Machine>
1686 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { 1649 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const {
1687 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1650 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1688 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1651 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1689 assert(this->getSrcSize() == 2); 1652 assert(this->getSrcSize() == 2);
1690 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); 1653 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid);
1691 // 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
1692 // not allowed in PNaCl. 1655 // not allowed in PNaCl.
1693 assert(llvm::isa<Variable>(this->getSrc(1))); 1656 assert(llvm::isa<Variable>(this->getSrc(1)));
1694 TargetLowering *Target = Func->getTarget(); 1657 auto *Target = this->getTarget(Func);
1695 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); 1658 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1));
1696 if (SrcVar->hasReg()) { 1659 if (SrcVar->hasReg()) {
1697 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( 1660 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
1698 this->getDest()->getRegNum()), 1661 this->getDest()->getRegNum()),
1699 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), 1662 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()),
1700 Condition); 1663 Condition);
1701 } else { 1664 } else {
1702 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 1665 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
1703 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1666 Target->stackVarToAsmOperand(SrcVar);
1704 Target)
1705 ->stackVarToAsmOperand(SrcVar);
1706 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( 1667 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
1707 this->getDest()->getRegNum()), 1668 this->getDest()->getRegNum()),
1708 SrcStackAddr, Condition); 1669 SrcStackAddr, Condition);
1709 } 1670 }
1710 } 1671 }
1711 1672
1712 template <class Machine> 1673 template <class Machine>
1713 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { 1674 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const {
1714 if (!BuildDefs::dump()) 1675 if (!BuildDefs::dump())
1715 return; 1676 return;
(...skipping 22 matching lines...) Expand all
1738 Str << ", "; 1699 Str << ", ";
1739 this->getSrc(0)->emit(Func); 1700 this->getSrc(0)->emit(Func);
1740 } 1701 }
1741 1702
1742 template <class Machine> 1703 template <class Machine>
1743 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { 1704 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const {
1744 assert(this->getSrcSize() == 3); 1705 assert(this->getSrcSize() == 3);
1745 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1706 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1746 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1707 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1747 Type Ty = this->getSrc(0)->getType(); 1708 Type Ty = this->getSrc(0)->getType();
1748 TargetLowering *Target = Func->getTarget(); 1709 auto *Target = this->getTarget(Func);
1749 const auto Mem = 1710 const auto Mem =
1750 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 1711 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
1751 this->getSrc(0)); 1712 this->getSrc(0));
1752 assert(Mem->getSegmentRegister() == 1713 assert(Mem->getSegmentRegister() ==
1753 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1714 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1754 const typename InstX86Base<Machine>::Traits::Address Addr = 1715 const typename InstX86Base<Machine>::Traits::Address Addr =
1755 Mem->toAsmAddress(Asm, Target); 1716 Mem->toAsmAddress(Asm, Target);
1756 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); 1717 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2));
1757 assert(VarReg->hasReg()); 1718 assert(VarReg->hasReg());
1758 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = 1719 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
(...skipping 29 matching lines...) Expand all
1788 template <class Machine> 1749 template <class Machine>
1789 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { 1750 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const {
1790 assert(this->getSrcSize() == 5); 1751 assert(this->getSrcSize() == 5);
1791 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1752 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1792 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1753 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1793 const auto Mem = 1754 const auto Mem =
1794 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 1755 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
1795 this->getSrc(0)); 1756 this->getSrc(0));
1796 assert(Mem->getSegmentRegister() == 1757 assert(Mem->getSegmentRegister() ==
1797 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1758 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1798 TargetLowering *Target = Func->getTarget(); 1759 auto *Target = this->getTarget(Func);
1799 const typename InstX86Base<Machine>::Traits::Address Addr = 1760 const typename InstX86Base<Machine>::Traits::Address Addr =
1800 Mem->toAsmAddress(Asm, Target); 1761 Mem->toAsmAddress(Asm, Target);
1801 Asm->cmpxchg8b(Addr, this->Locked); 1762 Asm->cmpxchg8b(Addr, this->Locked);
1802 } 1763 }
1803 1764
1804 template <class Machine> 1765 template <class Machine>
1805 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { 1766 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const {
1806 if (!BuildDefs::dump()) 1767 if (!BuildDefs::dump())
1807 return; 1768 return;
1808 Ostream &Str = Func->getContext()->getStrDump(); 1769 Ostream &Str = Func->getContext()->getStrDump();
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
2130 const Operand *Src = this->getSrc(0); 2091 const Operand *Src = this->getSrc(0);
2131 Type DestTy = Dest->getType(); 2092 Type DestTy = Dest->getType();
2132 if (isScalarFloatingType(DestTy)) { 2093 if (isScalarFloatingType(DestTy)) {
2133 // 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.
2134 const auto *SrcVar = llvm::cast<Variable>(Src); 2095 const auto *SrcVar = llvm::cast<Variable>(Src);
2135 assert(SrcVar->hasReg()); 2096 assert(SrcVar->hasReg());
2136 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 2097 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2137 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 2098 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2138 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2099 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2100 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2140 TargetLowering *Target = Func->getTarget(); 2101 auto *Target = this->getTarget(Func);
2141 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { 2102 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) {
2142 assert(!DestVar->hasReg()); 2103 assert(!DestVar->hasReg());
2143 typename InstX86Base<Machine>::Traits::Address StackAddr( 2104 typename InstX86Base<Machine>::Traits::Address StackAddr(
2144 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2105 Target->stackVarToAsmOperand(DestVar));
2145 Target)
2146 ->stackVarToAsmOperand(DestVar));
2147 Asm->movss(DestTy, StackAddr, SrcReg); 2106 Asm->movss(DestTy, StackAddr, SrcReg);
2148 } else { 2107 } else {
2149 const auto DestMem = 2108 const auto DestMem =
2150 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2109 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2151 Dest); 2110 Dest);
2152 assert(DestMem->getSegmentRegister() == 2111 assert(DestMem->getSegmentRegister() ==
2153 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2112 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2154 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg); 2113 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg);
2155 } 2114 }
2156 return; 2115 return;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2193 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2152 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2194 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2153 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2195 assert(this->getSrcSize() == 2); 2154 assert(this->getSrcSize() == 2);
2196 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2155 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2197 const auto DestMem = 2156 const auto DestMem =
2198 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2157 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2199 this->getSrc(1)); 2158 this->getSrc(1));
2200 assert(DestMem->getSegmentRegister() == 2159 assert(DestMem->getSegmentRegister() ==
2201 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2160 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2202 assert(SrcVar->hasReg()); 2161 assert(SrcVar->hasReg());
2203 TargetLowering *Target = Func->getTarget(); 2162 auto *Target = this->getTarget(Func);
2204 Asm->movups(DestMem->toAsmAddress(Asm, Target), 2163 Asm->movups(DestMem->toAsmAddress(Asm, Target),
2205 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 2164 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
2206 } 2165 }
2207 2166
2208 template <class Machine> 2167 template <class Machine>
2209 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { 2168 void InstX86StoreP<Machine>::dump(const Cfg *Func) const {
2210 if (!BuildDefs::dump()) 2169 if (!BuildDefs::dump())
2211 return; 2170 return;
2212 Ostream &Str = Func->getContext()->getStrDump(); 2171 Ostream &Str = Func->getContext()->getStrDump();
2213 Str << "storep." << this->getSrc(0)->getType() << " "; 2172 Str << "storep." << this->getSrc(0)->getType() << " ";
(...skipping 22 matching lines...) Expand all
2236 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2195 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2237 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2196 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2238 assert(this->getSrcSize() == 2); 2197 assert(this->getSrcSize() == 2);
2239 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2198 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2240 const auto DestMem = 2199 const auto DestMem =
2241 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2200 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2242 this->getSrc(1)); 2201 this->getSrc(1));
2243 assert(DestMem->getSegmentRegister() == 2202 assert(DestMem->getSegmentRegister() ==
2244 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2203 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2245 assert(SrcVar->hasReg()); 2204 assert(SrcVar->hasReg());
2246 TargetLowering *Target = Func->getTarget(); 2205 auto *Target = this->getTarget(Func);
2247 Asm->movq(DestMem->toAsmAddress(Asm, Target), 2206 Asm->movq(DestMem->toAsmAddress(Asm, Target),
2248 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 2207 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
2249 } 2208 }
2250 2209
2251 template <class Machine> 2210 template <class Machine>
2252 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { 2211 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const {
2253 if (!BuildDefs::dump()) 2212 if (!BuildDefs::dump())
2254 return; 2213 return;
2255 Ostream &Str = Func->getContext()->getStrDump(); 2214 Ostream &Str = Func->getContext()->getStrDump();
2256 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
2300 << (!isScalarFloatingType(DestTy) 2259 << (!isScalarFloatingType(DestTy)
2301 ? this->getWidthString(DestTy) 2260 ? this->getWidthString(DestTy)
2302 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] 2261 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy]
2303 .SdSsString) << "\t"; 2262 .SdSsString) << "\t";
2304 } 2263 }
2305 // 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,
2306 // 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.
2307 // TODO: This assert disallows usages such as copying a floating 2266 // TODO: This assert disallows usages such as copying a floating
2308 // 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
2309 // this up. 2268 // this up.
2310 TargetLowering *Target = Func->getTarget(); 2269 auto *Target = this->getTarget(Func);
2311 assert(Target->typeWidthInBytesOnStack(DestTy) == 2270 assert(Target->typeWidthInBytesOnStack(DestTy) ==
2312 Target->typeWidthInBytesOnStack(SrcTy)); 2271 Target->typeWidthInBytesOnStack(SrcTy));
2313 const Operand *NewSrc = Src; 2272 const Operand *NewSrc = Src;
2314 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 2273 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
2315 int32_t NewRegNum = Variable::NoRegister; 2274 int32_t NewRegNum = Variable::NoRegister;
2316 if (SrcVar->hasReg()) 2275 if (SrcVar->hasReg())
2317 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( 2276 NewRegNum = InstX86Base<Machine>::Traits::getGprForType(
2318 DestTy, SrcVar->getRegNum()); 2277 DestTy, SrcVar->getRegNum());
2319 if (SrcTy != DestTy) 2278 if (SrcTy != DestTy)
2320 NewSrc = SrcVar->asType(DestTy, NewRegNum); 2279 NewSrc = SrcVar->asType(DestTy, NewRegNum);
(...skipping 25 matching lines...) Expand all
2346 &InstX86Base<Machine>::Traits::Assembler::mov}; 2305 &InstX86Base<Machine>::Traits::Assembler::mov};
2347 static const typename InstX86Base< 2306 static const typename InstX86Base<
2348 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { 2307 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = {
2349 &InstX86Base<Machine>::Traits::Assembler::mov, 2308 &InstX86Base<Machine>::Traits::Assembler::mov,
2350 &InstX86Base<Machine>::Traits::Assembler::mov}; 2309 &InstX86Base<Machine>::Traits::Assembler::mov};
2351 // 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,
2352 // 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.
2353 // TODO: This assert disallows usages such as copying a floating 2312 // TODO: This assert disallows usages such as copying a floating
2354 // 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
2355 // this up. 2314 // this up.
2356 TargetLowering *Target = Func->getTarget(); 2315 auto *Target = this->getTarget(Func);
2357 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) == 2316 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) ==
2358 Target->typeWidthInBytesOnStack(Src->getType())); 2317 Target->typeWidthInBytesOnStack(Src->getType()));
2359 if (Dest->hasReg()) { 2318 if (Dest->hasReg()) {
2360 if (isScalarFloatingType(DestTy)) { 2319 if (isScalarFloatingType(DestTy)) {
2361 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); 2320 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter);
2362 return; 2321 return;
2363 } else { 2322 } else {
2364 assert(isScalarIntegerType(DestTy)); 2323 assert(isScalarIntegerType(DestTy));
2365 // 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
2366 // when both Src and Dest are integer types. 2325 // when both Src and Dest are integer types.
(...skipping 14 matching lines...) Expand all
2381 if (isScalarIntegerType(SrcTy)) { 2340 if (isScalarIntegerType(SrcTy)) {
2382 SrcTy = DestTy; 2341 SrcTy = DestTy;
2383 } 2342 }
2384 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); 2343 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter);
2385 return; 2344 return;
2386 } 2345 }
2387 } else { 2346 } else {
2388 // 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
2389 // decide on the emitters. 2348 // decide on the emitters.
2390 typename InstX86Base<Machine>::Traits::Address StackAddr( 2349 typename InstX86Base<Machine>::Traits::Address StackAddr(
2391 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2350 Target->stackVarToAsmOperand(Dest));
2392 Target)
2393 ->stackVarToAsmOperand(Dest));
2394 if (isScalarFloatingType(SrcTy)) { 2351 if (isScalarFloatingType(SrcTy)) {
2395 // Src must be a register. 2352 // Src must be a register.
2396 const auto *SrcVar = llvm::cast<Variable>(Src); 2353 const auto *SrcVar = llvm::cast<Variable>(Src);
2397 assert(SrcVar->hasReg()); 2354 assert(SrcVar->hasReg());
2398 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2355 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2399 Func->getAssembler< 2356 Func->getAssembler<
2400 typename InstX86Base<Machine>::Traits::Assembler>(); 2357 typename InstX86Base<Machine>::Traits::Assembler>();
2401 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( 2358 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm(
2402 SrcVar->getRegNum())); 2359 SrcVar->getRegNum()));
2403 return; 2360 return;
2404 } else { 2361 } else {
2405 // Src can be a register or immediate. 2362 // Src can be a register or immediate.
2406 assert(isScalarIntegerType(SrcTy)); 2363 assert(isScalarIntegerType(SrcTy));
2407 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); 2364 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter);
2408 return; 2365 return;
2409 } 2366 }
2410 return; 2367 return;
2411 } 2368 }
2412 } 2369 }
2413 2370
2414 template <class Machine> 2371 template <class Machine>
2415 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { 2372 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
2416 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2373 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2417 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2374 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2418 assert(this->getSrcSize() == 1); 2375 assert(this->getSrcSize() == 1);
2419 const Variable *Dest = this->getDest(); 2376 const Variable *Dest = this->getDest();
2420 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2377 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2421 TargetLowering *Target = Func->getTarget(); 2378 auto *Target = this->getTarget(Func);
2422 // 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
2423 // is an int type). 2380 // is an int type).
2424 if (SrcVar->getType() == IceType_i32 || 2381 if (SrcVar->getType() == IceType_i32 ||
2425 (InstX86Base<Machine>::Traits::Is64Bit && 2382 (InstX86Base<Machine>::Traits::Is64Bit &&
2426 SrcVar->getType() == IceType_i64)) { 2383 SrcVar->getType() == IceType_i64)) {
2427 assert(isVectorType(Dest->getType()) || 2384 assert(isVectorType(Dest->getType()) ||
2428 (isScalarFloatingType(Dest->getType()) && 2385 (isScalarFloatingType(Dest->getType()) &&
2429 typeWidthInBytes(SrcVar->getType()) == 2386 typeWidthInBytes(SrcVar->getType()) ==
2430 typeWidthInBytes(Dest->getType()))); 2387 typeWidthInBytes(Dest->getType())));
2431 assert(Dest->hasReg()); 2388 assert(Dest->hasReg());
2432 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = 2389 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2433 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); 2390 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2434 if (SrcVar->hasReg()) { 2391 if (SrcVar->hasReg()) {
2435 Asm->movd( 2392 Asm->movd(
2436 SrcVar->getType(), DestReg, 2393 SrcVar->getType(), DestReg,
2437 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 2394 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
2438 } else { 2395 } else {
2439 typename InstX86Base<Machine>::Traits::Address StackAddr( 2396 typename InstX86Base<Machine>::Traits::Address StackAddr(
2440 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2397 Target->stackVarToAsmOperand(SrcVar));
2441 Target)
2442 ->stackVarToAsmOperand(SrcVar));
2443 Asm->movd(SrcVar->getType(), DestReg, StackAddr); 2398 Asm->movd(SrcVar->getType(), DestReg, StackAddr);
2444 } 2399 }
2445 } else { 2400 } else {
2446 assert(isVectorType(SrcVar->getType()) || 2401 assert(isVectorType(SrcVar->getType()) ||
2447 (isScalarFloatingType(SrcVar->getType()) && 2402 (isScalarFloatingType(SrcVar->getType()) &&
2448 typeWidthInBytes(SrcVar->getType()) == 2403 typeWidthInBytes(SrcVar->getType()) ==
2449 typeWidthInBytes(Dest->getType()))); 2404 typeWidthInBytes(Dest->getType())));
2450 assert(SrcVar->hasReg()); 2405 assert(SrcVar->hasReg());
2451 assert(Dest->getType() == IceType_i32 || 2406 assert(Dest->getType() == IceType_i32 ||
2452 (InstX86Base<Machine>::Traits::Is64Bit && 2407 (InstX86Base<Machine>::Traits::Is64Bit &&
2453 Dest->getType() == IceType_i64)); 2408 Dest->getType() == IceType_i64));
2454 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 2409 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2455 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 2410 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2456 if (Dest->hasReg()) { 2411 if (Dest->hasReg()) {
2457 Asm->movd(Dest->getType(), 2412 Asm->movd(Dest->getType(),
2458 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), 2413 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()),
2459 SrcReg); 2414 SrcReg);
2460 } else { 2415 } else {
2461 typename InstX86Base<Machine>::Traits::Address StackAddr( 2416 typename InstX86Base<Machine>::Traits::Address StackAddr(
2462 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2417 Target->stackVarToAsmOperand(Dest));
2463 Target)
2464 ->stackVarToAsmOperand(Dest));
2465 Asm->movd(Dest->getType(), StackAddr, SrcReg); 2418 Asm->movd(Dest->getType(), StackAddr, SrcReg);
2466 } 2419 }
2467 } 2420 }
2468 } 2421 }
2469 2422
2470 template <class Machine> 2423 template <class Machine>
2471 void InstX86Movp<Machine>::emit(const Cfg *Func) const { 2424 void InstX86Movp<Machine>::emit(const Cfg *Func) const {
2472 if (!BuildDefs::dump()) 2425 if (!BuildDefs::dump())
2473 return; 2426 return;
2474 // 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
2616 Str << "\tfld" << this->getFldString(Ty) << "\t"; 2569 Str << "\tfld" << this->getFldString(Ty) << "\t";
2617 this->getSrc(0)->emit(Func); 2570 this->getSrc(0)->emit(Func);
2618 } 2571 }
2619 2572
2620 template <class Machine> 2573 template <class Machine>
2621 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { 2574 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
2622 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2575 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2623 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2576 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2624 assert(this->getSrcSize() == 1); 2577 assert(this->getSrcSize() == 1);
2625 const Operand *Src = this->getSrc(0); 2578 const Operand *Src = this->getSrc(0);
2626 TargetLowering *Target = Func->getTarget(); 2579 auto *Target = this->getTarget(Func);
2627 Type Ty = Src->getType(); 2580 Type Ty = Src->getType();
2628 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { 2581 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) {
2629 if (Var->hasReg()) { 2582 if (Var->hasReg()) {
2630 // 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
2631 // stack slot. 2584 // stack slot.
2632 Immediate Width(typeWidthInBytes(Ty)); 2585 Immediate Width(typeWidthInBytes(Ty));
2633 Asm->sub(IceType_i32, 2586 Asm->sub(IceType_i32,
2634 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 2587 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
2635 Width); 2588 Width);
2636 typename InstX86Base<Machine>::Traits::Address StackSlot = 2589 typename InstX86Base<Machine>::Traits::Address StackSlot =
2637 typename InstX86Base<Machine>::Traits::Address( 2590 typename InstX86Base<Machine>::Traits::Address(
2638 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, 2591 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0,
2639 AssemblerFixup::NoFixup); 2592 AssemblerFixup::NoFixup);
2640 Asm->movss(Ty, StackSlot, 2593 Asm->movss(Ty, StackSlot,
2641 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); 2594 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()));
2642 Asm->fld(Ty, StackSlot); 2595 Asm->fld(Ty, StackSlot);
2643 Asm->add(IceType_i32, 2596 Asm->add(IceType_i32,
2644 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 2597 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
2645 Width); 2598 Width);
2646 } else { 2599 } else {
2647 typename InstX86Base<Machine>::Traits::Address StackAddr( 2600 typename InstX86Base<Machine>::Traits::Address StackAddr(
2648 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2601 Target->stackVarToAsmOperand(Var));
2649 Target)
2650 ->stackVarToAsmOperand(Var));
2651 Asm->fld(Ty, StackAddr); 2602 Asm->fld(Ty, StackAddr);
2652 } 2603 }
2653 } else if (const auto *Mem = llvm::dyn_cast< 2604 } else if (const auto *Mem = llvm::dyn_cast<
2654 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 2605 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
2655 assert(Mem->getSegmentRegister() == 2606 assert(Mem->getSegmentRegister() ==
2656 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2607 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2657 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target)); 2608 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target));
2658 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { 2609 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) {
2659 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); 2610 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm));
2660 } else { 2611 } else {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2710 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2661 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2711 assert(this->getSrcSize() == 0); 2662 assert(this->getSrcSize() == 0);
2712 const Variable *Dest = this->getDest(); 2663 const Variable *Dest = this->getDest();
2713 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to 2664 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to
2714 // "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,
2715 // 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.
2716 if (!Dest) { 2667 if (!Dest) {
2717 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); 2668 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0));
2718 return; 2669 return;
2719 } 2670 }
2720 TargetLowering *Target = Func->getTarget(); 2671 auto *Target = this->getTarget(Func);
2721 Type Ty = Dest->getType(); 2672 Type Ty = Dest->getType();
2722 if (!Dest->hasReg()) { 2673 if (!Dest->hasReg()) {
2723 typename InstX86Base<Machine>::Traits::Address StackAddr( 2674 typename InstX86Base<Machine>::Traits::Address StackAddr(
2724 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2675 Target->stackVarToAsmOperand(Dest));
2725 Target)
2726 ->stackVarToAsmOperand(Dest));
2727 Asm->fstp(Ty, StackAddr); 2676 Asm->fstp(Ty, StackAddr);
2728 } else { 2677 } else {
2729 // 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.
2730 // 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,
2731 // loading it into the xmm register, and deallocating the stack slot. 2680 // loading it into the xmm register, and deallocating the stack slot.
2732 Immediate Width(typeWidthInBytes(Ty)); 2681 Immediate Width(typeWidthInBytes(Ty));
2733 Asm->sub(IceType_i32, 2682 Asm->sub(IceType_i32,
2734 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); 2683 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width);
2735 typename InstX86Base<Machine>::Traits::Address StackSlot = 2684 typename InstX86Base<Machine>::Traits::Address StackSlot =
2736 typename InstX86Base<Machine>::Traits::Address( 2685 typename InstX86Base<Machine>::Traits::Address(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2778 this->emitTwoAddress(buf, this, Func); 2727 this->emitTwoAddress(buf, this, Func);
2779 } 2728 }
2780 2729
2781 template <class Machine> 2730 template <class Machine>
2782 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { 2731 void InstX86Pextr<Machine>::emit(const Cfg *Func) const {
2783 if (!BuildDefs::dump()) 2732 if (!BuildDefs::dump())
2784 return; 2733 return;
2785 Ostream &Str = Func->getContext()->getStrEmit(); 2734 Ostream &Str = Func->getContext()->getStrEmit();
2786 assert(this->getSrcSize() == 2); 2735 assert(this->getSrcSize() == 2);
2787 // pextrb and pextrd are SSE4.1 instructions. 2736 // pextrb and pextrd are SSE4.1 instructions.
2788 TargetLowering *Target = Func->getTarget(); 2737 auto *Target = this->getTarget(Func);
2789 assert(this->getSrc(0)->getType() == IceType_v8i16 || 2738 assert(this->getSrc(0)->getType() == IceType_v8i16 ||
2790 this->getSrc(0)->getType() == IceType_v8i1 || 2739 this->getSrc(0)->getType() == IceType_v8i1 ||
2791 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2740 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2792 Target)
2793 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2794 Str << "\t" << this->Opcode 2741 Str << "\t" << this->Opcode
2795 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) 2742 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
2796 ->getType()] 2743 ->getType()]
2797 .PackString << "\t"; 2744 .PackString << "\t";
2798 this->getSrc(1)->emit(Func); 2745 this->getSrc(1)->emit(Func);
2799 Str << ", "; 2746 Str << ", ";
2800 this->getSrc(0)->emit(Func); 2747 this->getSrc(0)->emit(Func);
2801 Str << ", "; 2748 Str << ", ";
2802 Variable *Dest = this->getDest(); 2749 Variable *Dest = this->getDest();
2803 // 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
2804 // 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
2805 // all to have a register dest for now. 2752 // all to have a register dest for now.
2806 assert(Dest->hasReg()); 2753 assert(Dest->hasReg());
2807 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); 2754 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func);
2808 } 2755 }
2809 2756
2810 template <class Machine> 2757 template <class Machine>
2811 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { 2758 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
2812 assert(this->getSrcSize() == 2); 2759 assert(this->getSrcSize() == 2);
2813 // pextrb and pextrd are SSE4.1 instructions. 2760 // pextrb and pextrd are SSE4.1 instructions.
2814 const Variable *Dest = this->getDest(); 2761 const Variable *Dest = this->getDest();
2815 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( 2762 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
2816 this->getSrc(0)->getType()); 2763 this->getSrc(0)->getType());
2817 TargetLowering *Target = Func->getTarget(); 2764 auto *Target = this->getTarget(Func);
2818 assert(DispatchTy == IceType_i16 || 2765 assert(DispatchTy == IceType_i16 ||
2819 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2766 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2820 Target)
2821 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2822 // 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
2823 // 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
2824 // all to have a register dest for now. 2769 // all to have a register dest for now.
2825 assert(Dest->hasReg()); 2770 assert(Dest->hasReg());
2826 // 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).
2827 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); 2772 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg());
2828 static const typename InstX86Base<Machine>::Traits::Assembler:: 2773 static const typename InstX86Base<Machine>::Traits::Assembler::
2829 template ThreeOpImmEmitter< 2774 template ThreeOpImmEmitter<
2830 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 2775 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
2831 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> 2776 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister>
2832 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; 2777 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr};
2833 emitIASThreeOpImmOps< 2778 emitIASThreeOpImmOps<
2834 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 2779 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
2835 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, 2780 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister,
2836 InstX86Base<Machine>::Traits::getEncodedGPR, 2781 InstX86Base<Machine>::Traits::getEncodedGPR,
2837 InstX86Base<Machine>::Traits::getEncodedXmm>( 2782 InstX86Base<Machine>::Traits::getEncodedXmm>(
2838 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); 2783 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter);
2839 } 2784 }
2840 2785
2841 template <class Machine> 2786 template <class Machine>
2842 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { 2787 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
2843 if (!BuildDefs::dump()) 2788 if (!BuildDefs::dump())
2844 return; 2789 return;
2845 Ostream &Str = Func->getContext()->getStrEmit(); 2790 Ostream &Str = Func->getContext()->getStrEmit();
2846 assert(this->getSrcSize() == 3); 2791 assert(this->getSrcSize() == 3);
2847 // pinsrb and pinsrd are SSE4.1 instructions. 2792 // pinsrb and pinsrd are SSE4.1 instructions.
2848 TargetLowering *Target = Func->getTarget(); 2793 auto *Target = this->getTarget(Func);
2849 assert(this->getDest()->getType() == IceType_v8i16 || 2794 assert(this->getDest()->getType() == IceType_v8i16 ||
2850 this->getDest()->getType() == IceType_v8i1 || 2795 this->getDest()->getType() == IceType_v8i1 ||
2851 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2796 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2852 Target)
2853 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2854 Str << "\t" << this->Opcode 2797 Str << "\t" << this->Opcode
2855 << InstX86Base< 2798 << InstX86Base<
2856 Machine>::Traits::TypeAttributes[this->getDest()->getType()] 2799 Machine>::Traits::TypeAttributes[this->getDest()->getType()]
2857 .PackString << "\t"; 2800 .PackString << "\t";
2858 this->getSrc(2)->emit(Func); 2801 this->getSrc(2)->emit(Func);
2859 Str << ", "; 2802 Str << ", ";
2860 Operand *Src1 = this->getSrc(1); 2803 Operand *Src1 = this->getSrc(1);
2861 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { 2804 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) {
2862 // If src1 is a register, it should always be r32. 2805 // If src1 is a register, it should always be r32.
2863 if (Src1Var->hasReg()) { 2806 if (Src1Var->hasReg()) {
(...skipping 11 matching lines...) Expand all
2875 this->getDest()->emit(Func); 2818 this->getDest()->emit(Func);
2876 } 2819 }
2877 2820
2878 template <class Machine> 2821 template <class Machine>
2879 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { 2822 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
2880 assert(this->getSrcSize() == 3); 2823 assert(this->getSrcSize() == 3);
2881 assert(this->getDest() == this->getSrc(0)); 2824 assert(this->getDest() == this->getSrc(0));
2882 // pinsrb and pinsrd are SSE4.1 instructions. 2825 // pinsrb and pinsrd are SSE4.1 instructions.
2883 const Operand *Src0 = this->getSrc(1); 2826 const Operand *Src0 = this->getSrc(1);
2884 Type DispatchTy = Src0->getType(); 2827 Type DispatchTy = Src0->getType();
2885 TargetLowering *Target = Func->getTarget(); 2828 auto *Target = this->getTarget(Func);
2886 assert(DispatchTy == IceType_i16 || 2829 assert(DispatchTy == IceType_i16 ||
2887 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2830 Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2888 Target)
2889 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2890 // 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
2891 // 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
2892 // 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
2893 // like "ah". 2834 // like "ah".
2894 if (BuildDefs::asserts()) { 2835 if (BuildDefs::asserts()) {
2895 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { 2836 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) {
2896 if (Src0Var->hasReg()) { 2837 if (Src0Var->hasReg()) {
2897 int32_t RegNum = Src0Var->getRegNum(); 2838 int32_t RegNum = Src0Var->getRegNum();
2898 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); 2839 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum);
2899 (void)BaseRegNum; 2840 (void)BaseRegNum;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 2907
2967 template <class Machine> 2908 template <class Machine>
2968 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { 2909 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const {
2969 assert(this->getSrcSize() == 0); 2910 assert(this->getSrcSize() == 0);
2970 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2911 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2971 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2912 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2972 if (this->getDest()->hasReg()) { 2913 if (this->getDest()->hasReg()) {
2973 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( 2914 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR(
2974 this->getDest()->getRegNum())); 2915 this->getDest()->getRegNum()));
2975 } else { 2916 } else {
2976 TargetLowering *Target = Func->getTarget(); 2917 auto *Target = this->getTarget(Func);
2977 Asm->popl( 2918 Asm->popl(Target->stackVarToAsmOperand(this->getDest()));
2978 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2979 Target)
2980 ->stackVarToAsmOperand(this->getDest()));
2981 } 2919 }
2982 } 2920 }
2983 2921
2984 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { 2922 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const {
2985 if (!BuildDefs::dump()) 2923 if (!BuildDefs::dump())
2986 return; 2924 return;
2987 Ostream &Str = Func->getContext()->getStrDump(); 2925 Ostream &Str = Func->getContext()->getStrDump();
2988 this->dumpDest(Func); 2926 this->dumpDest(Func);
2989 Str << " = pop." << this->getDest()->getType() << " "; 2927 Str << " = pop." << this->getDest()->getType() << " ";
2990 } 2928 }
2991 2929
2992 template <class Machine> 2930 template <class Machine>
2993 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { 2931 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const {
2994 if (!BuildDefs::dump()) 2932 if (!BuildDefs::dump())
2995 return; 2933 return;
2996 Ostream &Str = Func->getContext()->getStrEmit(); 2934 Ostream &Str = Func->getContext()->getStrEmit();
2997 Str << "\tsubl\t$" << Amount << ", %esp"; 2935 Str << "\tsubl\t$" << Amount << ", %esp";
2998 TargetLowering *Target = Func->getTarget(); 2936 auto *Target = this->getTarget(Func);
2999 Target->updateStackAdjustment(Amount); 2937 Target->updateStackAdjustment(Amount);
3000 } 2938 }
3001 2939
3002 template <class Machine> 2940 template <class Machine>
3003 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { 2941 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const {
3004 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2942 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3005 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2943 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3006 Asm->sub(IceType_i32, 2944 Asm->sub(IceType_i32,
3007 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 2945 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
3008 Immediate(Amount)); 2946 Immediate(Amount));
3009 TargetLowering *Target = Func->getTarget(); 2947 auto *Target = this->getTarget(Func);
3010 Target->updateStackAdjustment(Amount); 2948 Target->updateStackAdjustment(Amount);
3011 } 2949 }
3012 2950
3013 template <class Machine> 2951 template <class Machine>
3014 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { 2952 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const {
3015 if (!BuildDefs::dump()) 2953 if (!BuildDefs::dump())
3016 return; 2954 return;
3017 Ostream &Str = Func->getContext()->getStrDump(); 2955 Ostream &Str = Func->getContext()->getStrDump();
3018 Str << "esp = sub.i32 esp, " << Amount; 2956 Str << "esp = sub.i32 esp, " << Amount;
3019 } 2957 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
3130 this->Dest->emit(Func); 3068 this->Dest->emit(Func);
3131 } 3069 }
3132 3070
3133 template <class Machine> 3071 template <class Machine>
3134 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { 3072 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const {
3135 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); 3073 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None);
3136 assert(this->getDest()->getType() == IceType_i1); 3074 assert(this->getDest()->getType() == IceType_i1);
3137 assert(this->getSrcSize() == 0); 3075 assert(this->getSrcSize() == 0);
3138 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3076 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3077 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3140 TargetLowering *Target = Func->getTarget(); 3078 auto *Target = this->getTarget(Func);
3141 if (this->getDest()->hasReg()) 3079 if (this->getDest()->hasReg())
3142 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( 3080 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg(
3143 this->getDest()->getRegNum())); 3081 this->getDest()->getRegNum()));
3144 else 3082 else
3145 Asm->setcc( 3083 Asm->setcc(Condition, Target->stackVarToAsmOperand(this->getDest()));
3146 Condition,
3147 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
3148 Target)
3149 ->stackVarToAsmOperand(this->getDest()));
3150 return; 3084 return;
3151 } 3085 }
3152 3086
3153 template <class Machine> 3087 template <class Machine>
3154 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { 3088 void InstX86Setcc<Machine>::dump(const Cfg *Func) const {
3155 if (!BuildDefs::dump()) 3089 if (!BuildDefs::dump())
3156 return; 3090 return;
3157 Ostream &Str = Func->getContext()->getStrDump(); 3091 Ostream &Str = Func->getContext()->getStrDump();
3158 Str << "setcc." 3092 Str << "setcc."
3159 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString 3093 << InstX86Base<Machine>::Traits::InstBrAttributes[Condition].DisplayString
(...skipping 19 matching lines...) Expand all
3179 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { 3113 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const {
3180 assert(this->getSrcSize() == 2); 3114 assert(this->getSrcSize() == 2);
3181 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3115 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3182 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3116 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3183 Type Ty = this->getSrc(0)->getType(); 3117 Type Ty = this->getSrc(0)->getType();
3184 const auto Mem = 3118 const auto Mem =
3185 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 3119 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
3186 this->getSrc(0)); 3120 this->getSrc(0));
3187 assert(Mem->getSegmentRegister() == 3121 assert(Mem->getSegmentRegister() ==
3188 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 3122 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
3189 TargetLowering *Target = Func->getTarget(); 3123 auto *Target = this->getTarget(Func);
3190 const typename InstX86Base<Machine>::Traits::Address Addr = 3124 const typename InstX86Base<Machine>::Traits::Address Addr =
3191 Mem->toAsmAddress(Asm, Target); 3125 Mem->toAsmAddress(Asm, Target);
3192 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); 3126 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1));
3193 assert(VarReg->hasReg()); 3127 assert(VarReg->hasReg());
3194 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = 3128 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
3195 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); 3129 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum());
3196 Asm->xadd(Ty, Addr, Reg, this->Locked); 3130 Asm->xadd(Ty, Addr, Reg, this->Locked);
3197 } 3131 }
3198 3132
3199 template <class Machine> 3133 template <class Machine>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3237 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); 3171 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum());
3238 Asm->xchg(Ty, Reg0, Reg1); 3172 Asm->xchg(Ty, Reg0, Reg1);
3239 return; 3173 return;
3240 } 3174 }
3241 3175
3242 const auto *Mem = 3176 const auto *Mem =
3243 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 3177 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
3244 this->getSrc(0)); 3178 this->getSrc(0));
3245 assert(Mem->getSegmentRegister() == 3179 assert(Mem->getSegmentRegister() ==
3246 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 3180 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
3247 TargetLowering *Target = Func->getTarget(); 3181 auto *Target = this->getTarget(Func);
3248 const typename InstX86Base<Machine>::Traits::Address Addr = 3182 const typename InstX86Base<Machine>::Traits::Address Addr =
3249 Mem->toAsmAddress(Asm, Target); 3183 Mem->toAsmAddress(Asm, Target);
3250 Asm->xchg(Ty, Addr, Reg1); 3184 Asm->xchg(Ty, Addr, Reg1);
3251 } 3185 }
3252 3186
3253 template <class Machine> 3187 template <class Machine>
3254 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { 3188 void InstX86Xchg<Machine>::dump(const Cfg *Func) const {
3255 if (!BuildDefs::dump()) 3189 if (!BuildDefs::dump())
3256 return; 3190 return;
3257 Ostream &Str = Func->getContext()->getStrDump(); 3191 Ostream &Str = Func->getContext()->getStrDump();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3310 return; 3244 return;
3311 Ostream &Str = Func->getContext()->getStrDump(); 3245 Ostream &Str = Func->getContext()->getStrDump();
3312 Str << "IACA_END"; 3246 Str << "IACA_END";
3313 } 3247 }
3314 3248
3315 } // end of namespace X86Internal 3249 } // end of namespace X86Internal
3316 3250
3317 } // end of namespace Ice 3251 } // end of namespace Ice
3318 3252
3319 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H 3253 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H
OLDNEW
« no previous file with comments | « src/IceInstX86Base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698