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

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