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

Side by Side Diff: src/IceInstX86BaseImpl.h

Issue 1411583007: Combine allocas (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Finish fast path. 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/IceInstX8664.cpp ('k') | src/IceOperand.h » ('j') | 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 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 getJmpTarget()->dump(Func); 562 getJmpTarget()->dump(Func);
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 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(getCallTarget())) { 572 Operand *CallTarget = getCallTarget();
573 TargetLowering *Target = Func->getTarget();
574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
573 // Emit without a leading '$'. 575 // Emit without a leading '$'.
574 Str << CI->getValue(); 576 Str << CI->getValue();
575 } else if (const auto CallTarget = 577 } else if (const auto DirectCallTarget =
576 llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) { 578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) {
577 CallTarget->emitWithoutPrefix(Func->getTarget()); 579 DirectCallTarget->emitWithoutPrefix(Target);
578 } else { 580 } else {
579 Str << "*"; 581 Str << "*";
580 getCallTarget()->emit(Func); 582 CallTarget->emit(Func);
581 } 583 }
582 Func->getTarget()->resetStackAdjustment(); 584 Target->resetStackAdjustment();
583 } 585 }
584 586
585 template <class Machine> 587 template <class Machine>
586 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { 588 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const {
587 typename InstX86Base<Machine>::Traits::Assembler *Asm = 589 typename InstX86Base<Machine>::Traits::Assembler *Asm =
588 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 590 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
589 Operand *Target = getCallTarget(); 591 Operand *CallTarget = getCallTarget();
590 if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { 592 TargetLowering *Target = Func->getTarget();
593 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) {
591 if (Var->hasReg()) { 594 if (Var->hasReg()) {
592 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); 595 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()));
593 } else { 596 } else {
594 Asm->call( 597 Asm->call(
595 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 598 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
596 Func->getTarget()) 599 Target)
597 ->stackVarToAsmOperand(Var)); 600 ->stackVarToAsmOperand(Var));
598 } 601 }
599 } else if (const auto *Mem = llvm::dyn_cast< 602 } else if (const auto *Mem = llvm::dyn_cast<
600 typename InstX86Base<Machine>::Traits::X86OperandMem>( 603 typename InstX86Base<Machine>::Traits::X86OperandMem>(
601 Target)) { 604 CallTarget)) {
602 assert(Mem->getSegmentRegister() == 605 assert(Mem->getSegmentRegister() ==
603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 606 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
604 Asm->call(Mem->toAsmAddress(Asm)); 607 Asm->call(Mem->toAsmAddress(Asm, Target));
605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { 608 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) {
606 assert(CR->getOffset() == 0 && "We only support calling a function"); 609 assert(CR->getOffset() == 0 && "We only support calling a function");
607 Asm->call(CR); 610 Asm->call(CR);
608 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { 611 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
609 Asm->call(Immediate(Imm->getValue())); 612 Asm->call(Immediate(Imm->getValue()));
610 } else { 613 } else {
611 llvm_unreachable("Unexpected operand type"); 614 llvm_unreachable("Unexpected operand type");
612 } 615 }
613 Func->getTarget()->resetStackAdjustment(); 616 Target->resetStackAdjustment();
614 } 617 }
615 618
616 template <class Machine> 619 template <class Machine>
617 void InstX86Call<Machine>::dump(const Cfg *Func) const { 620 void InstX86Call<Machine>::dump(const Cfg *Func) const {
618 if (!BuildDefs::dump()) 621 if (!BuildDefs::dump())
619 return; 622 return;
620 Ostream &Str = Func->getContext()->getStrDump(); 623 Ostream &Str = Func->getContext()->getStrDump();
621 if (this->getDest()) { 624 if (this->getDest()) {
622 this->dumpDest(Func); 625 this->dumpDest(Func);
623 Str << " = "; 626 Str << " = ";
(...skipping 20 matching lines...) Expand all
644 << "\t"; 647 << "\t";
645 Src1->emit(Func); 648 Src1->emit(Func);
646 Str << ", "; 649 Str << ", ";
647 Dest->emit(Func); 650 Dest->emit(Func);
648 } 651 }
649 652
650 template <class Machine> 653 template <class Machine>
651 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, 654 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op,
652 const typename InstX86Base< 655 const typename InstX86Base<
653 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { 656 Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) {
657 TargetLowering *Target = Func->getTarget();
654 typename InstX86Base<Machine>::Traits::Assembler *Asm = 658 typename InstX86Base<Machine>::Traits::Assembler *Asm =
655 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 659 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
656 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { 660 if (const auto *Var = llvm::dyn_cast<Variable>(Op)) {
657 if (Var->hasReg()) { 661 if (Var->hasReg()) {
658 // We cheat a little and use GPRRegister even for byte operations. 662 // We cheat a little and use GPRRegister even for byte operations.
659 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = 663 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg =
660 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); 664 InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum());
661 (Asm->*(Emitter.Reg))(Ty, VarReg); 665 (Asm->*(Emitter.Reg))(Ty, VarReg);
662 } else { 666 } else {
663 typename InstX86Base<Machine>::Traits::Address StackAddr( 667 typename InstX86Base<Machine>::Traits::Address StackAddr(
664 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 668 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
665 Func->getTarget()) 669 Target)
666 ->stackVarToAsmOperand(Var)); 670 ->stackVarToAsmOperand(Var));
667 (Asm->*(Emitter.Addr))(Ty, StackAddr); 671 (Asm->*(Emitter.Addr))(Ty, StackAddr);
668 } 672 }
669 } else if (const auto *Mem = llvm::dyn_cast< 673 } else if (const auto *Mem = llvm::dyn_cast<
670 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { 674 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) {
671 Mem->emitSegmentOverride(Asm); 675 Mem->emitSegmentOverride(Asm);
672 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm)); 676 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Target));
673 } else { 677 } else {
674 llvm_unreachable("Unexpected operand type"); 678 llvm_unreachable("Unexpected operand type");
675 } 679 }
676 } 680 }
677 681
678 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte> 682 template <class Machine, bool VarCanBeByte, bool SrcCanBeByte>
679 void emitIASRegOpTyGPR( 683 void emitIASRegOpTyGPR(
680 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, 684 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
681 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp 685 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp
682 &Emitter) { 686 &Emitter) {
687 TargetLowering *Target = Func->getTarget();
683 typename InstX86Base<Machine>::Traits::Assembler *Asm = 688 typename InstX86Base<Machine>::Traits::Assembler *Asm =
684 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 689 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
685 assert(Var->hasReg()); 690 assert(Var->hasReg());
686 // We cheat a little and use GPRRegister even for byte operations. 691 // We cheat a little and use GPRRegister even for byte operations.
687 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = 692 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg =
688 VarCanBeByte 693 VarCanBeByte
689 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) 694 ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())
690 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); 695 : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum());
691 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 696 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
692 if (SrcVar->hasReg()) { 697 if (SrcVar->hasReg()) {
693 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = 698 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg =
694 SrcCanBeByte 699 SrcCanBeByte
695 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) 700 ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())
696 : InstX86Base<Machine>::Traits::getEncodedGPR( 701 : InstX86Base<Machine>::Traits::getEncodedGPR(
697 SrcVar->getRegNum()); 702 SrcVar->getRegNum());
698 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); 703 (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg);
699 } else { 704 } else {
700 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 705 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
701 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 706 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
702 Func->getTarget()) 707 Target)
703 ->stackVarToAsmOperand(SrcVar); 708 ->stackVarToAsmOperand(SrcVar);
704 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); 709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr);
705 } 710 }
706 } else if (const auto *Mem = llvm::dyn_cast< 711 } else if (const auto *Mem = llvm::dyn_cast<
707 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 712 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
708 Mem->emitSegmentOverride(Asm); 713 Mem->emitSegmentOverride(Asm);
709 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); 714 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
710 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { 715 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
711 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); 716 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue()));
712 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { 717 } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
713 AssemblerFixup *Fixup = 718 AssemblerFixup *Fixup =
714 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); 719 Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc);
715 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); 720 (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup));
716 } else if (const auto *Split = llvm::dyn_cast< 721 } else if (const auto *Split = llvm::dyn_cast<
717 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { 722 typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) {
718 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); 723 (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func));
719 } else { 724 } else {
(...skipping 25 matching lines...) Expand all
745 } else { 750 } else {
746 llvm_unreachable("Unexpected operand type"); 751 llvm_unreachable("Unexpected operand type");
747 } 752 }
748 } 753 }
749 754
750 template <class Machine> 755 template <class Machine>
751 void emitIASAsAddrOpTyGPR( 756 void emitIASAsAddrOpTyGPR(
752 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, 757 const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1,
753 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp 758 const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp
754 &Emitter) { 759 &Emitter) {
760 TargetLowering *Target = Func->getTarget();
755 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) { 761 if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) {
756 assert(!Op0Var->hasReg()); 762 assert(!Op0Var->hasReg());
757 typename InstX86Base<Machine>::Traits::Address StackAddr( 763 typename InstX86Base<Machine>::Traits::Address StackAddr(
758 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 764 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
759 Func->getTarget()) 765 Target)
760 ->stackVarToAsmOperand(Op0Var)); 766 ->stackVarToAsmOperand(Op0Var));
761 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); 767 emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter);
762 } else if (const auto *Op0Mem = llvm::dyn_cast< 768 } else if (const auto *Op0Mem = llvm::dyn_cast<
763 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { 769 typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) {
764 typename InstX86Base<Machine>::Traits::Assembler *Asm = 770 typename InstX86Base<Machine>::Traits::Assembler *Asm =
765 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 771 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
766 Op0Mem->emitSegmentOverride(Asm); 772 Op0Mem->emitSegmentOverride(Asm);
767 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm), Op1, 773 emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm, Target),
768 Emitter); 774 Op1, Emitter);
769 } else if (const auto *Split = llvm::dyn_cast< 775 } else if (const auto *Split = llvm::dyn_cast<
770 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { 776 typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) {
771 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, 777 emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1,
772 Emitter); 778 Emitter);
773 } else { 779 } else {
774 llvm_unreachable("Unexpected operand type"); 780 llvm_unreachable("Unexpected operand type");
775 } 781 }
776 } 782 }
777 783
778 template <class Machine> 784 template <class Machine>
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); 834 InstX86Base<Machine>::Traits::RegisterSet::Reg_cl);
829 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); 835 (Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg);
830 } 836 }
831 } 837 }
832 838
833 template <class Machine> 839 template <class Machine>
834 void emitIASXmmShift( 840 void emitIASXmmShift(
835 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, 841 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
836 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp 842 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp
837 &Emitter) { 843 &Emitter) {
844 TargetLowering *Target = Func->getTarget();
838 typename InstX86Base<Machine>::Traits::Assembler *Asm = 845 typename InstX86Base<Machine>::Traits::Assembler *Asm =
839 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 846 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
840 assert(Var->hasReg()); 847 assert(Var->hasReg());
841 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = 848 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg =
842 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); 849 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum());
843 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 850 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
844 if (SrcVar->hasReg()) { 851 if (SrcVar->hasReg()) {
845 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 852 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
846 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 853 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
847 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); 854 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg);
848 } else { 855 } else {
849 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 856 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
850 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 857 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
851 Func->getTarget()) 858 Target)
852 ->stackVarToAsmOperand(SrcVar); 859 ->stackVarToAsmOperand(SrcVar);
853 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); 860 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
854 } 861 }
855 } else if (const auto *Mem = llvm::dyn_cast< 862 } else if (const auto *Mem = llvm::dyn_cast<
856 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 863 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
857 assert(Mem->getSegmentRegister() == 864 assert(Mem->getSegmentRegister() ==
858 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 865 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
859 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); 866 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
860 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { 867 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
861 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); 868 (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue()));
862 } else { 869 } else {
863 llvm_unreachable("Unexpected operand type"); 870 llvm_unreachable("Unexpected operand type");
864 } 871 }
865 } 872 }
866 873
867 template <class Machine> 874 template <class Machine>
868 void emitIASRegOpTyXMM( 875 void emitIASRegOpTyXMM(
869 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, 876 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
870 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp 877 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
871 &Emitter) { 878 &Emitter) {
879 TargetLowering *Target = Func->getTarget();
872 typename InstX86Base<Machine>::Traits::Assembler *Asm = 880 typename InstX86Base<Machine>::Traits::Assembler *Asm =
873 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 881 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
874 assert(Var->hasReg()); 882 assert(Var->hasReg());
875 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = 883 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg =
876 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); 884 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum());
877 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 885 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
878 if (SrcVar->hasReg()) { 886 if (SrcVar->hasReg()) {
879 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 887 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
880 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 888 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
881 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); 889 (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg);
882 } else { 890 } else {
883 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 891 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
884 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 892 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
885 Func->getTarget()) 893 Target)
886 ->stackVarToAsmOperand(SrcVar); 894 ->stackVarToAsmOperand(SrcVar);
887 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); 895 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
888 } 896 }
889 } else if (const auto *Mem = llvm::dyn_cast< 897 } else if (const auto *Mem = llvm::dyn_cast<
890 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 898 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
891 assert(Mem->getSegmentRegister() == 899 assert(Mem->getSegmentRegister() ==
892 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 900 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
893 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); 901 (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
894 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { 902 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) {
895 (Asm->*(Emitter.XmmAddr))( 903 (Asm->*(Emitter.XmmAddr))(
896 Ty, VarReg, 904 Ty, VarReg,
897 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); 905 InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm));
898 } else { 906 } else {
899 llvm_unreachable("Unexpected operand type"); 907 llvm_unreachable("Unexpected operand type");
900 } 908 }
901 } 909 }
902 910
903 template <class Machine, typename DReg_t, typename SReg_t, 911 template <class Machine, typename DReg_t, typename SReg_t,
904 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> 912 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)>
905 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, 913 void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest,
906 Type SrcTy, const Operand *Src, 914 Type SrcTy, const Operand *Src,
907 const typename InstX86Base<Machine>::Traits::Assembler:: 915 const typename InstX86Base<Machine>::Traits::Assembler::
908 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) { 916 template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) {
917 TargetLowering *Target = Func->getTarget();
909 typename InstX86Base<Machine>::Traits::Assembler *Asm = 918 typename InstX86Base<Machine>::Traits::Assembler *Asm =
910 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 919 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
911 assert(Dest->hasReg()); 920 assert(Dest->hasReg());
912 DReg_t DestReg = destEnc(Dest->getRegNum()); 921 DReg_t DestReg = destEnc(Dest->getRegNum());
913 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 922 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
914 if (SrcVar->hasReg()) { 923 if (SrcVar->hasReg()) {
915 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); 924 SReg_t SrcReg = srcEnc(SrcVar->getRegNum());
916 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); 925 (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg);
917 } else { 926 } else {
918 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 927 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
919 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 928 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
920 Func->getTarget()) 929 Target)
921 ->stackVarToAsmOperand(SrcVar); 930 ->stackVarToAsmOperand(SrcVar);
922 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); 931 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr);
923 } 932 }
924 } else if (const auto *Mem = llvm::dyn_cast< 933 } else if (const auto *Mem = llvm::dyn_cast<
925 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 934 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
926 Mem->emitSegmentOverride(Asm); 935 Mem->emitSegmentOverride(Asm);
927 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, Mem->toAsmAddress(Asm)); 936 (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy,
937 Mem->toAsmAddress(Asm, Target));
928 } else { 938 } else {
929 llvm_unreachable("Unexpected operand type"); 939 llvm_unreachable("Unexpected operand type");
930 } 940 }
931 } 941 }
932 942
933 template <class Machine, typename DReg_t, typename SReg_t, 943 template <class Machine, typename DReg_t, typename SReg_t,
934 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)> 944 DReg_t (*destEnc)(int32_t), SReg_t (*srcEnc)(int32_t)>
935 void emitIASThreeOpImmOps( 945 void emitIASThreeOpImmOps(
936 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0, 946 const Cfg *Func, Type DispatchTy, const Variable *Dest, const Operand *Src0,
937 const Operand *Src1, 947 const Operand *Src1,
938 const typename InstX86Base<Machine>::Traits::Assembler:: 948 const typename InstX86Base<Machine>::Traits::Assembler::
939 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) { 949 template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) {
950 TargetLowering *Target = Func->getTarget();
940 typename InstX86Base<Machine>::Traits::Assembler *Asm = 951 typename InstX86Base<Machine>::Traits::Assembler *Asm =
941 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 952 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
942 // This only handles Dest being a register, and Src1 being an immediate. 953 // This only handles Dest being a register, and Src1 being an immediate.
943 assert(Dest->hasReg()); 954 assert(Dest->hasReg());
944 DReg_t DestReg = destEnc(Dest->getRegNum()); 955 DReg_t DestReg = destEnc(Dest->getRegNum());
945 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); 956 Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue());
946 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { 957 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) {
947 if (SrcVar->hasReg()) { 958 if (SrcVar->hasReg()) {
948 SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); 959 SReg_t SrcReg = srcEnc(SrcVar->getRegNum());
949 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); 960 (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm);
950 } else { 961 } else {
951 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 962 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
952 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 963 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
953 Func->getTarget()) 964 Target)
954 ->stackVarToAsmOperand(SrcVar); 965 ->stackVarToAsmOperand(SrcVar);
955 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); 966 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm);
956 } 967 }
957 } else if (const auto *Mem = llvm::dyn_cast< 968 } else if (const auto *Mem = llvm::dyn_cast<
958 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) { 969 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) {
959 Mem->emitSegmentOverride(Asm); 970 Mem->emitSegmentOverride(Asm);
960 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, Mem->toAsmAddress(Asm), 971 (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg,
961 Imm); 972 Mem->toAsmAddress(Asm, Target), Imm);
962 } else { 973 } else {
963 llvm_unreachable("Unexpected operand type"); 974 llvm_unreachable("Unexpected operand type");
964 } 975 }
965 } 976 }
966 977
967 template <class Machine> 978 template <class Machine>
968 void emitIASMovlikeXMM( 979 void emitIASMovlikeXMM(
969 const Cfg *Func, const Variable *Dest, const Operand *Src, 980 const Cfg *Func, const Variable *Dest, const Operand *Src,
970 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps 981 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps
971 Emitter) { 982 Emitter) {
983 TargetLowering *Target = Func->getTarget();
972 typename InstX86Base<Machine>::Traits::Assembler *Asm = 984 typename InstX86Base<Machine>::Traits::Assembler *Asm =
973 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 985 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
974 if (Dest->hasReg()) { 986 if (Dest->hasReg()) {
975 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = 987 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
976 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); 988 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
977 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 989 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
978 if (SrcVar->hasReg()) { 990 if (SrcVar->hasReg()) {
979 (Asm->*(Emitter.XmmXmm))( 991 (Asm->*(Emitter.XmmXmm))(
980 DestReg, 992 DestReg,
981 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 993 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
982 } else { 994 } else {
983 typename InstX86Base<Machine>::Traits::Address StackAddr( 995 typename InstX86Base<Machine>::Traits::Address StackAddr(
984 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering 996 static_cast<
985 *>(Func->getTarget()) 997 typename InstX86Base<Machine>::Traits::TargetLowering *>(Target)
986 ->stackVarToAsmOperand(SrcVar)); 998 ->stackVarToAsmOperand(SrcVar));
987 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); 999 (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr);
988 } 1000 }
989 } else if (const auto *SrcMem = llvm::dyn_cast< 1001 } else if (const auto *SrcMem = llvm::dyn_cast<
990 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 1002 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
991 assert(SrcMem->getSegmentRegister() == 1003 assert(SrcMem->getSegmentRegister() ==
992 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1004 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
993 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm)); 1005 (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm, Target));
994 } else { 1006 } else {
995 llvm_unreachable("Unexpected operand type"); 1007 llvm_unreachable("Unexpected operand type");
996 } 1008 }
997 } else { 1009 } else {
998 typename InstX86Base<Machine>::Traits::Address StackAddr( 1010 typename InstX86Base<Machine>::Traits::Address StackAddr(
999 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1011 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1000 Func->getTarget()) 1012 Target)
1001 ->stackVarToAsmOperand(Dest)); 1013 ->stackVarToAsmOperand(Dest));
1002 // Src must be a register in this case. 1014 // Src must be a register in this case.
1003 const auto *SrcVar = llvm::cast<Variable>(Src); 1015 const auto *SrcVar = llvm::cast<Variable>(Src);
1004 assert(SrcVar->hasReg()); 1016 assert(SrcVar->hasReg());
1005 (Asm->*(Emitter.AddrXmm))( 1017 (Asm->*(Emitter.AddrXmm))(
1006 StackAddr, 1018 StackAddr,
1007 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 1019 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
1008 } 1020 }
1009 } 1021 }
1010 1022
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 this->emitTwoAddress(buf, this, Func); 1059 this->emitTwoAddress(buf, this, Func);
1048 } 1060 }
1049 1061
1050 template <class Machine> 1062 template <class Machine>
1051 void InstX86Pmull<Machine>::emit(const Cfg *Func) const { 1063 void InstX86Pmull<Machine>::emit(const Cfg *Func) const {
1052 if (!BuildDefs::dump()) 1064 if (!BuildDefs::dump())
1053 return; 1065 return;
1054 char buf[30]; 1066 char buf[30];
1055 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || 1067 bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 ||
1056 this->getDest()->getType() == IceType_v8i16; 1068 this->getDest()->getType() == IceType_v8i16;
1069 TargetLowering *Target = Func->getTarget();
1057 bool InstructionSetIsValid = 1070 bool InstructionSetIsValid =
1058 this->getDest()->getType() == IceType_v8i16 || 1071 this->getDest()->getType() == IceType_v8i16 ||
1059 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1072 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1060 Func->getTarget()) 1073 Target)
1061 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; 1074 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
1062 (void)TypesAreValid; 1075 (void)TypesAreValid;
1063 (void)InstructionSetIsValid; 1076 (void)InstructionSetIsValid;
1064 assert(TypesAreValid); 1077 assert(TypesAreValid);
1065 assert(InstructionSetIsValid); 1078 assert(InstructionSetIsValid);
1066 snprintf( 1079 snprintf(
1067 buf, llvm::array_lengthof(buf), "pmull%s", 1080 buf, llvm::array_lengthof(buf), "pmull%s",
1068 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] 1081 InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()]
1069 .PackString); 1082 .PackString);
1070 this->emitTwoAddress(buf, this, Func); 1083 this->emitTwoAddress(buf, this, Func);
1071 } 1084 }
1072 1085
1073 template <class Machine> 1086 template <class Machine>
1074 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { 1087 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const {
1075 Type Ty = this->getDest()->getType(); 1088 Type Ty = this->getDest()->getType();
1076 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; 1089 bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16;
1090 TargetLowering *Target = Func->getTarget();
1077 bool InstructionSetIsValid = 1091 bool InstructionSetIsValid =
1078 Ty == IceType_v8i16 || 1092 Ty == IceType_v8i16 ||
1079 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1093 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1080 Func->getTarget()) 1094 Target)
1081 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; 1095 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
1082 (void)TypesAreValid; 1096 (void)TypesAreValid;
1083 (void)InstructionSetIsValid; 1097 (void)InstructionSetIsValid;
1084 assert(TypesAreValid); 1098 assert(TypesAreValid);
1085 assert(InstructionSetIsValid); 1099 assert(InstructionSetIsValid);
1086 assert(this->getSrcSize() == 2); 1100 assert(this->getSrcSize() == 2);
1087 Type ElementTy = typeElementType(Ty); 1101 Type ElementTy = typeElementType(Ty);
1088 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), 1102 emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1),
1089 this->Emitter); 1103 this->Emitter);
1090 } 1104 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0); 1229 InstX86Base<Machine>::Traits::RegisterSet::Reg_xmm0);
1216 const Variable *Dest = Inst->getDest(); 1230 const Variable *Dest = Inst->getDest();
1217 const Operand *Src = Inst->getSrc(1); 1231 const Operand *Src = Inst->getSrc(1);
1218 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter); 1232 emitIASRegOpTyXMM<Machine>(Func, Dest->getType(), Dest, Src, Emitter);
1219 } 1233 }
1220 1234
1221 template <class Machine> 1235 template <class Machine>
1222 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { 1236 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const {
1223 if (!BuildDefs::dump()) 1237 if (!BuildDefs::dump())
1224 return; 1238 return;
1239 TargetLowering *Target = Func->getTarget();
1225 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1240 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1226 Func->getTarget()) 1241 Target)
1227 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 1242 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1228 emitVariableBlendInst<Machine>(this->Opcode, this, Func); 1243 emitVariableBlendInst<Machine>(this->Opcode, this, Func);
1229 } 1244 }
1230 1245
1231 template <class Machine> 1246 template <class Machine>
1232 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { 1247 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const {
1248 TargetLowering *Target = Func->getTarget();
1233 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1249 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1234 Func->getTarget()) 1250 Target)
1235 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 1251 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1236 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp 1252 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
1237 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, 1253 Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
1238 &InstX86Base<Machine>::Traits::Assembler::blendvps}; 1254 &InstX86Base<Machine>::Traits::Assembler::blendvps};
1239 emitIASVariableBlendInst<Machine>(this, Func, Emitter); 1255 emitIASVariableBlendInst<Machine>(this, Func, Emitter);
1240 } 1256 }
1241 1257
1242 template <class Machine> 1258 template <class Machine>
1243 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { 1259 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
1244 if (!BuildDefs::dump()) 1260 if (!BuildDefs::dump())
1245 return; 1261 return;
1262 TargetLowering *Target = Func->getTarget();
1246 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1263 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1247 Func->getTarget()) 1264 Target)
1248 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 1265 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1249 emitVariableBlendInst<Machine>(this->Opcode, this, Func); 1266 emitVariableBlendInst<Machine>(this->Opcode, this, Func);
1250 } 1267 }
1251 1268
1252 template <class Machine> 1269 template <class Machine>
1253 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { 1270 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const {
1271 TargetLowering *Target = Func->getTarget();
1254 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1272 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1255 Func->getTarget()) 1273 Target)
1256 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 1274 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1257 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp 1275 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
1258 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, 1276 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
1259 &InstX86Base<Machine>::Traits::Assembler::pblendvb}; 1277 &InstX86Base<Machine>::Traits::Assembler::pblendvb};
1260 emitIASVariableBlendInst<Machine>(this, Func, Emitter); 1278 emitIASVariableBlendInst<Machine>(this, Func, Emitter);
1261 } 1279 }
1262 1280
1263 template <class Machine> 1281 template <class Machine>
1264 void InstX86Imul<Machine>::emit(const Cfg *Func) const { 1282 void InstX86Imul<Machine>::emit(const Cfg *Func) const {
1265 if (!BuildDefs::dump()) 1283 if (!BuildDefs::dump())
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 1368 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
1351 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 1369 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
1352 InstX86Base<Machine>::Traits::getEncodedGPR, 1370 InstX86Base<Machine>::Traits::getEncodedGPR,
1353 InstX86Base<Machine>::Traits::getEncodedGPR>( 1371 InstX86Base<Machine>::Traits::getEncodedGPR>(
1354 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); 1372 Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter);
1355 } 1373 }
1356 1374
1357 template <class Machine> 1375 template <class Machine>
1358 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { 1376 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const {
1359 assert(this->getSrcSize() == 3); 1377 assert(this->getSrcSize() == 3);
1378 TargetLowering *Target = Func->getTarget();
1360 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1379 assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1361 Func->getTarget()) 1380 Target)
1362 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 1381 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
1363 const Variable *Dest = this->getDest(); 1382 const Variable *Dest = this->getDest();
1364 assert(Dest == this->getSrc(0)); 1383 assert(Dest == this->getSrc(0));
1365 Type Ty = Dest->getType(); 1384 Type Ty = Dest->getType();
1366 static const typename InstX86Base<Machine>::Traits::Assembler:: 1385 static const typename InstX86Base<Machine>::Traits::Assembler::
1367 template ThreeOpImmEmitter< 1386 template ThreeOpImmEmitter<
1368 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, 1387 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister,
1369 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> 1388 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister>
1370 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps, 1389 Emitter = {&InstX86Base<Machine>::Traits::Assembler::insertps,
1371 &InstX86Base<Machine>::Traits::Assembler::insertps}; 1390 &InstX86Base<Machine>::Traits::Assembler::insertps};
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { 1617 void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const {
1599 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); 1618 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None);
1600 assert(this->getDest()->hasReg()); 1619 assert(this->getDest()->hasReg());
1601 assert(this->getSrcSize() == 2); 1620 assert(this->getSrcSize() == 2);
1602 Operand *Src = this->getSrc(1); 1621 Operand *Src = this->getSrc(1);
1603 Type SrcTy = Src->getType(); 1622 Type SrcTy = Src->getType();
1604 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || 1623 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 ||
1605 (InstX86Base<Machine>::Traits::Is64Bit)); 1624 (InstX86Base<Machine>::Traits::Is64Bit));
1606 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1625 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1607 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1626 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1627 TargetLowering *Target = Func->getTarget();
1608 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 1628 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
1609 if (SrcVar->hasReg()) { 1629 if (SrcVar->hasReg()) {
1610 Asm->cmov( 1630 Asm->cmov(
1611 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1631 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1612 this->getDest()->getRegNum()), 1632 this->getDest()->getRegNum()),
1613 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 1633 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
1614 } else { 1634 } else {
1615 Asm->cmov( 1635 Asm->cmov(
1616 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1636 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1617 this->getDest()->getRegNum()), 1637 this->getDest()->getRegNum()),
1618 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1638 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1619 Func->getTarget()) 1639 Target)
1620 ->stackVarToAsmOperand(SrcVar)); 1640 ->stackVarToAsmOperand(SrcVar));
1621 } 1641 }
1622 } else if (const auto *Mem = llvm::dyn_cast< 1642 } else if (const auto *Mem = llvm::dyn_cast<
1623 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 1643 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
1624 assert(Mem->getSegmentRegister() == 1644 assert(Mem->getSegmentRegister() ==
1625 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1645 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1626 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( 1646 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
1627 this->getDest()->getRegNum()), 1647 this->getDest()->getRegNum()),
1628 Mem->toAsmAddress(Asm)); 1648 Mem->toAsmAddress(Asm, Target));
1629 } else { 1649 } else {
1630 llvm_unreachable("Unexpected operand type"); 1650 llvm_unreachable("Unexpected operand type");
1631 } 1651 }
1632 } 1652 }
1633 1653
1634 template <class Machine> 1654 template <class Machine>
1635 void InstX86Cmov<Machine>::dump(const Cfg *Func) const { 1655 void InstX86Cmov<Machine>::dump(const Cfg *Func) const {
1636 if (!BuildDefs::dump()) 1656 if (!BuildDefs::dump())
1637 return; 1657 return;
1638 Ostream &Str = Func->getContext()->getStrDump(); 1658 Ostream &Str = Func->getContext()->getStrDump();
(...skipping 25 matching lines...) Expand all
1664 1684
1665 template <class Machine> 1685 template <class Machine>
1666 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const { 1686 void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const {
1667 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1687 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1668 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1688 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1669 assert(this->getSrcSize() == 2); 1689 assert(this->getSrcSize() == 2);
1670 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid); 1690 assert(Condition < InstX86Base<Machine>::Traits::Cond::Cmpps_Invalid);
1671 // Assuming there isn't any load folding for cmpps, and vector constants are 1691 // Assuming there isn't any load folding for cmpps, and vector constants are
1672 // not allowed in PNaCl. 1692 // not allowed in PNaCl.
1673 assert(llvm::isa<Variable>(this->getSrc(1))); 1693 assert(llvm::isa<Variable>(this->getSrc(1)));
1694 TargetLowering *Target = Func->getTarget();
1674 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); 1695 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1));
1675 if (SrcVar->hasReg()) { 1696 if (SrcVar->hasReg()) {
1676 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( 1697 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
1677 this->getDest()->getRegNum()), 1698 this->getDest()->getRegNum()),
1678 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), 1699 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()),
1679 Condition); 1700 Condition);
1680 } else { 1701 } else {
1681 typename InstX86Base<Machine>::Traits::Address SrcStackAddr = 1702 typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
1682 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 1703 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
1683 Func->getTarget()) 1704 Target)
1684 ->stackVarToAsmOperand(SrcVar); 1705 ->stackVarToAsmOperand(SrcVar);
1685 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( 1706 Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
1686 this->getDest()->getRegNum()), 1707 this->getDest()->getRegNum()),
1687 SrcStackAddr, Condition); 1708 SrcStackAddr, Condition);
1688 } 1709 }
1689 } 1710 }
1690 1711
1691 template <class Machine> 1712 template <class Machine>
1692 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const { 1713 void InstX86Cmpps<Machine>::dump(const Cfg *Func) const {
1693 if (!BuildDefs::dump()) 1714 if (!BuildDefs::dump())
(...skipping 23 matching lines...) Expand all
1717 Str << ", "; 1738 Str << ", ";
1718 this->getSrc(0)->emit(Func); 1739 this->getSrc(0)->emit(Func);
1719 } 1740 }
1720 1741
1721 template <class Machine> 1742 template <class Machine>
1722 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { 1743 void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const {
1723 assert(this->getSrcSize() == 3); 1744 assert(this->getSrcSize() == 3);
1724 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1745 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1725 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1746 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1726 Type Ty = this->getSrc(0)->getType(); 1747 Type Ty = this->getSrc(0)->getType();
1748 TargetLowering *Target = Func->getTarget();
1727 const auto Mem = 1749 const auto Mem =
1728 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 1750 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
1729 this->getSrc(0)); 1751 this->getSrc(0));
1730 assert(Mem->getSegmentRegister() == 1752 assert(Mem->getSegmentRegister() ==
1731 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1753 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1732 const typename InstX86Base<Machine>::Traits::Address Addr = 1754 const typename InstX86Base<Machine>::Traits::Address Addr =
1733 Mem->toAsmAddress(Asm); 1755 Mem->toAsmAddress(Asm, Target);
1734 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); 1756 const auto *VarReg = llvm::cast<Variable>(this->getSrc(2));
1735 assert(VarReg->hasReg()); 1757 assert(VarReg->hasReg());
1736 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = 1758 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
1737 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); 1759 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum());
1738 Asm->cmpxchg(Ty, Addr, Reg, this->Locked); 1760 Asm->cmpxchg(Ty, Addr, Reg, this->Locked);
1739 } 1761 }
1740 1762
1741 template <class Machine> 1763 template <class Machine>
1742 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const { 1764 void InstX86Cmpxchg<Machine>::dump(const Cfg *Func) const {
1743 if (!BuildDefs::dump()) 1765 if (!BuildDefs::dump())
(...skipping 22 matching lines...) Expand all
1766 template <class Machine> 1788 template <class Machine>
1767 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const { 1789 void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const {
1768 assert(this->getSrcSize() == 5); 1790 assert(this->getSrcSize() == 5);
1769 typename InstX86Base<Machine>::Traits::Assembler *Asm = 1791 typename InstX86Base<Machine>::Traits::Assembler *Asm =
1770 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 1792 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
1771 const auto Mem = 1793 const auto Mem =
1772 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 1794 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
1773 this->getSrc(0)); 1795 this->getSrc(0));
1774 assert(Mem->getSegmentRegister() == 1796 assert(Mem->getSegmentRegister() ==
1775 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 1797 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
1798 TargetLowering *Target = Func->getTarget();
1776 const typename InstX86Base<Machine>::Traits::Address Addr = 1799 const typename InstX86Base<Machine>::Traits::Address Addr =
1777 Mem->toAsmAddress(Asm); 1800 Mem->toAsmAddress(Asm, Target);
1778 Asm->cmpxchg8b(Addr, this->Locked); 1801 Asm->cmpxchg8b(Addr, this->Locked);
1779 } 1802 }
1780 1803
1781 template <class Machine> 1804 template <class Machine>
1782 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const { 1805 void InstX86Cmpxchg8b<Machine>::dump(const Cfg *Func) const {
1783 if (!BuildDefs::dump()) 1806 if (!BuildDefs::dump())
1784 return; 1807 return;
1785 Ostream &Str = Func->getContext()->getStrDump(); 1808 Ostream &Str = Func->getContext()->getStrDump();
1786 if (this->Locked) { 1809 if (this->Locked) {
1787 Str << "lock "; 1810 Str << "lock ";
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
2107 const Operand *Src = this->getSrc(0); 2130 const Operand *Src = this->getSrc(0);
2108 Type DestTy = Dest->getType(); 2131 Type DestTy = Dest->getType();
2109 if (isScalarFloatingType(DestTy)) { 2132 if (isScalarFloatingType(DestTy)) {
2110 // Src must be a register, since Dest is a Mem operand of some kind. 2133 // Src must be a register, since Dest is a Mem operand of some kind.
2111 const auto *SrcVar = llvm::cast<Variable>(Src); 2134 const auto *SrcVar = llvm::cast<Variable>(Src);
2112 assert(SrcVar->hasReg()); 2135 assert(SrcVar->hasReg());
2113 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 2136 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2114 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 2137 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2115 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2138 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2116 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2140 TargetLowering *Target = Func->getTarget();
2117 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) { 2141 if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) {
2118 assert(!DestVar->hasReg()); 2142 assert(!DestVar->hasReg());
2119 typename InstX86Base<Machine>::Traits::Address StackAddr( 2143 typename InstX86Base<Machine>::Traits::Address StackAddr(
2120 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2144 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2121 Func->getTarget()) 2145 Target)
2122 ->stackVarToAsmOperand(DestVar)); 2146 ->stackVarToAsmOperand(DestVar));
2123 Asm->movss(DestTy, StackAddr, SrcReg); 2147 Asm->movss(DestTy, StackAddr, SrcReg);
2124 } else { 2148 } else {
2125 const auto DestMem = 2149 const auto DestMem =
2126 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2150 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2127 Dest); 2151 Dest);
2128 assert(DestMem->getSegmentRegister() == 2152 assert(DestMem->getSegmentRegister() ==
2129 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2153 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2130 Asm->movss(DestTy, DestMem->toAsmAddress(Asm), SrcReg); 2154 Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg);
2131 } 2155 }
2132 return; 2156 return;
2133 } else { 2157 } else {
2134 assert(isScalarIntegerType(DestTy)); 2158 assert(isScalarIntegerType(DestTy));
2135 static const typename InstX86Base< 2159 static const typename InstX86Base<
2136 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { 2160 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = {
2137 &InstX86Base<Machine>::Traits::Assembler::mov, 2161 &InstX86Base<Machine>::Traits::Assembler::mov,
2138 &InstX86Base<Machine>::Traits::Assembler::mov}; 2162 &InstX86Base<Machine>::Traits::Assembler::mov};
2139 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter); 2163 emitIASAsAddrOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRAddrEmitter);
2140 } 2164 }
(...skipping 28 matching lines...) Expand all
2169 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2193 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2170 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2194 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2171 assert(this->getSrcSize() == 2); 2195 assert(this->getSrcSize() == 2);
2172 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2196 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2173 const auto DestMem = 2197 const auto DestMem =
2174 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2198 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2175 this->getSrc(1)); 2199 this->getSrc(1));
2176 assert(DestMem->getSegmentRegister() == 2200 assert(DestMem->getSegmentRegister() ==
2177 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2201 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2178 assert(SrcVar->hasReg()); 2202 assert(SrcVar->hasReg());
2179 Asm->movups(DestMem->toAsmAddress(Asm), 2203 TargetLowering *Target = Func->getTarget();
2204 Asm->movups(DestMem->toAsmAddress(Asm, Target),
2180 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 2205 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
2181 } 2206 }
2182 2207
2183 template <class Machine> 2208 template <class Machine>
2184 void InstX86StoreP<Machine>::dump(const Cfg *Func) const { 2209 void InstX86StoreP<Machine>::dump(const Cfg *Func) const {
2185 if (!BuildDefs::dump()) 2210 if (!BuildDefs::dump())
2186 return; 2211 return;
2187 Ostream &Str = Func->getContext()->getStrDump(); 2212 Ostream &Str = Func->getContext()->getStrDump();
2188 Str << "storep." << this->getSrc(0)->getType() << " "; 2213 Str << "storep." << this->getSrc(0)->getType() << " ";
2189 this->getSrc(1)->dump(Func); 2214 this->getSrc(1)->dump(Func);
(...skipping 21 matching lines...) Expand all
2211 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2236 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2212 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2237 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2213 assert(this->getSrcSize() == 2); 2238 assert(this->getSrcSize() == 2);
2214 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2239 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2215 const auto DestMem = 2240 const auto DestMem =
2216 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 2241 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2217 this->getSrc(1)); 2242 this->getSrc(1));
2218 assert(DestMem->getSegmentRegister() == 2243 assert(DestMem->getSegmentRegister() ==
2219 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2244 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2220 assert(SrcVar->hasReg()); 2245 assert(SrcVar->hasReg());
2221 Asm->movq(DestMem->toAsmAddress(Asm), 2246 TargetLowering *Target = Func->getTarget();
2247 Asm->movq(DestMem->toAsmAddress(Asm, Target),
2222 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); 2248 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
2223 } 2249 }
2224 2250
2225 template <class Machine> 2251 template <class Machine>
2226 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const { 2252 void InstX86StoreQ<Machine>::dump(const Cfg *Func) const {
2227 if (!BuildDefs::dump()) 2253 if (!BuildDefs::dump())
2228 return; 2254 return;
2229 Ostream &Str = Func->getContext()->getStrDump(); 2255 Ostream &Str = Func->getContext()->getStrDump();
2230 Str << "storeq." << this->getSrc(0)->getType() << " "; 2256 Str << "storeq." << this->getSrc(0)->getType() << " ";
2231 this->getSrc(1)->dump(Func); 2257 this->getSrc(1)->dump(Func);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2274 << (!isScalarFloatingType(DestTy) 2300 << (!isScalarFloatingType(DestTy)
2275 ? this->getWidthString(DestTy) 2301 ? this->getWidthString(DestTy)
2276 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy] 2302 : InstX86Base<Machine>::Traits::TypeAttributes[DestTy]
2277 .SdSsString) << "\t"; 2303 .SdSsString) << "\t";
2278 } 2304 }
2279 // For an integer truncation operation, src is wider than dest. In this case, 2305 // For an integer truncation operation, src is wider than dest. In this case,
2280 // we use a mov instruction whose data width matches the narrower dest. 2306 // we use a mov instruction whose data width matches the narrower dest.
2281 // TODO: This assert disallows usages such as copying a floating 2307 // TODO: This assert disallows usages such as copying a floating
2282 // point value between a vector and a scalar (which movss is used for). Clean 2308 // point value between a vector and a scalar (which movss is used for). Clean
2283 // this up. 2309 // this up.
2284 assert(Func->getTarget()->typeWidthInBytesOnStack(DestTy) == 2310 TargetLowering *Target = Func->getTarget();
2285 Func->getTarget()->typeWidthInBytesOnStack(SrcTy)); 2311 assert(Target->typeWidthInBytesOnStack(DestTy) ==
2312 Target->typeWidthInBytesOnStack(SrcTy));
2286 const Operand *NewSrc = Src; 2313 const Operand *NewSrc = Src;
2287 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { 2314 if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
2288 int32_t NewRegNum = Variable::NoRegister; 2315 int32_t NewRegNum = Variable::NoRegister;
2289 if (SrcVar->hasReg()) 2316 if (SrcVar->hasReg())
2290 NewRegNum = InstX86Base<Machine>::Traits::getGprForType( 2317 NewRegNum = InstX86Base<Machine>::Traits::getGprForType(
2291 DestTy, SrcVar->getRegNum()); 2318 DestTy, SrcVar->getRegNum());
2292 if (SrcTy != DestTy) 2319 if (SrcTy != DestTy)
2293 NewSrc = SrcVar->asType(DestTy, NewRegNum); 2320 NewSrc = SrcVar->asType(DestTy, NewRegNum);
2294 } 2321 }
2295 NewSrc->emit(Func); 2322 NewSrc->emit(Func);
(...skipping 23 matching lines...) Expand all
2319 &InstX86Base<Machine>::Traits::Assembler::mov}; 2346 &InstX86Base<Machine>::Traits::Assembler::mov};
2320 static const typename InstX86Base< 2347 static const typename InstX86Base<
2321 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = { 2348 Machine>::Traits::Assembler::GPREmitterAddrOp GPRAddrEmitter = {
2322 &InstX86Base<Machine>::Traits::Assembler::mov, 2349 &InstX86Base<Machine>::Traits::Assembler::mov,
2323 &InstX86Base<Machine>::Traits::Assembler::mov}; 2350 &InstX86Base<Machine>::Traits::Assembler::mov};
2324 // For an integer truncation operation, src is wider than dest. In this case, 2351 // For an integer truncation operation, src is wider than dest. In this case,
2325 // we use a mov instruction whose data width matches the narrower dest. 2352 // we use a mov instruction whose data width matches the narrower dest.
2326 // TODO: This assert disallows usages such as copying a floating 2353 // TODO: This assert disallows usages such as copying a floating
2327 // point value between a vector and a scalar (which movss is used for). Clean 2354 // point value between a vector and a scalar (which movss is used for). Clean
2328 // this up. 2355 // this up.
2329 assert( 2356 TargetLowering *Target = Func->getTarget();
2330 Func->getTarget()->typeWidthInBytesOnStack(this->getDest()->getType()) == 2357 assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) ==
2331 Func->getTarget()->typeWidthInBytesOnStack(Src->getType())); 2358 Target->typeWidthInBytesOnStack(Src->getType()));
2332 if (Dest->hasReg()) { 2359 if (Dest->hasReg()) {
2333 if (isScalarFloatingType(DestTy)) { 2360 if (isScalarFloatingType(DestTy)) {
2334 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter); 2361 emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter);
2335 return; 2362 return;
2336 } else { 2363 } else {
2337 assert(isScalarIntegerType(DestTy)); 2364 assert(isScalarIntegerType(DestTy));
2338 // Widen DestTy for truncation (see above note). We should only do this 2365 // Widen DestTy for truncation (see above note). We should only do this
2339 // when both Src and Dest are integer types. 2366 // when both Src and Dest are integer types.
2340 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 && 2367 if (InstX86Base<Machine>::Traits::Is64Bit && DestTy == IceType_i64 &&
2341 isIntegerConstant(Src)) { 2368 isIntegerConstant(Src)) {
(...skipping 13 matching lines...) Expand all
2355 SrcTy = DestTy; 2382 SrcTy = DestTy;
2356 } 2383 }
2357 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter); 2384 emitIASRegOpTyGPR<Machine>(Func, DestTy, Dest, Src, GPRRegEmitter);
2358 return; 2385 return;
2359 } 2386 }
2360 } else { 2387 } else {
2361 // Dest must be Stack and Src *could* be a register. Use Src's type to 2388 // Dest must be Stack and Src *could* be a register. Use Src's type to
2362 // decide on the emitters. 2389 // decide on the emitters.
2363 typename InstX86Base<Machine>::Traits::Address StackAddr( 2390 typename InstX86Base<Machine>::Traits::Address StackAddr(
2364 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2391 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2365 Func->getTarget()) 2392 Target)
2366 ->stackVarToAsmOperand(Dest)); 2393 ->stackVarToAsmOperand(Dest));
2367 if (isScalarFloatingType(SrcTy)) { 2394 if (isScalarFloatingType(SrcTy)) {
2368 // Src must be a register. 2395 // Src must be a register.
2369 const auto *SrcVar = llvm::cast<Variable>(Src); 2396 const auto *SrcVar = llvm::cast<Variable>(Src);
2370 assert(SrcVar->hasReg()); 2397 assert(SrcVar->hasReg());
2371 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2398 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2372 Func->getAssembler< 2399 Func->getAssembler<
2373 typename InstX86Base<Machine>::Traits::Assembler>(); 2400 typename InstX86Base<Machine>::Traits::Assembler>();
2374 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( 2401 Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm(
2375 SrcVar->getRegNum())); 2402 SrcVar->getRegNum()));
2376 return; 2403 return;
2377 } else { 2404 } else {
2378 // Src can be a register or immediate. 2405 // Src can be a register or immediate.
2379 assert(isScalarIntegerType(SrcTy)); 2406 assert(isScalarIntegerType(SrcTy));
2380 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter); 2407 emitIASAddrOpTyGPR<Machine>(Func, SrcTy, StackAddr, Src, GPRAddrEmitter);
2381 return; 2408 return;
2382 } 2409 }
2383 return; 2410 return;
2384 } 2411 }
2385 } 2412 }
2386 2413
2387 template <class Machine> 2414 template <class Machine>
2388 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { 2415 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
2389 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2416 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2390 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2417 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2391 assert(this->getSrcSize() == 1); 2418 assert(this->getSrcSize() == 1);
2392 const Variable *Dest = this->getDest(); 2419 const Variable *Dest = this->getDest();
2393 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); 2420 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2421 TargetLowering *Target = Func->getTarget();
2394 // For insert/extract element (one of Src/Dest is an Xmm vector and the other 2422 // For insert/extract element (one of Src/Dest is an Xmm vector and the other
2395 // is an int type). 2423 // is an int type).
2396 if (SrcVar->getType() == IceType_i32 || 2424 if (SrcVar->getType() == IceType_i32 ||
2397 (InstX86Base<Machine>::Traits::Is64Bit && 2425 (InstX86Base<Machine>::Traits::Is64Bit &&
2398 SrcVar->getType() == IceType_i64)) { 2426 SrcVar->getType() == IceType_i64)) {
2399 assert(isVectorType(Dest->getType()) || 2427 assert(isVectorType(Dest->getType()) ||
2400 (isScalarFloatingType(Dest->getType()) && 2428 (isScalarFloatingType(Dest->getType()) &&
2401 typeWidthInBytes(SrcVar->getType()) == 2429 typeWidthInBytes(SrcVar->getType()) ==
2402 typeWidthInBytes(Dest->getType()))); 2430 typeWidthInBytes(Dest->getType())));
2403 assert(Dest->hasReg()); 2431 assert(Dest->hasReg());
2404 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = 2432 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2405 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); 2433 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2406 if (SrcVar->hasReg()) { 2434 if (SrcVar->hasReg()) {
2407 Asm->movd( 2435 Asm->movd(
2408 SrcVar->getType(), DestReg, 2436 SrcVar->getType(), DestReg,
2409 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 2437 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
2410 } else { 2438 } else {
2411 typename InstX86Base<Machine>::Traits::Address StackAddr( 2439 typename InstX86Base<Machine>::Traits::Address StackAddr(
2412 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2440 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2413 Func->getTarget()) 2441 Target)
2414 ->stackVarToAsmOperand(SrcVar)); 2442 ->stackVarToAsmOperand(SrcVar));
2415 Asm->movd(SrcVar->getType(), DestReg, StackAddr); 2443 Asm->movd(SrcVar->getType(), DestReg, StackAddr);
2416 } 2444 }
2417 } else { 2445 } else {
2418 assert(isVectorType(SrcVar->getType()) || 2446 assert(isVectorType(SrcVar->getType()) ||
2419 (isScalarFloatingType(SrcVar->getType()) && 2447 (isScalarFloatingType(SrcVar->getType()) &&
2420 typeWidthInBytes(SrcVar->getType()) == 2448 typeWidthInBytes(SrcVar->getType()) ==
2421 typeWidthInBytes(Dest->getType()))); 2449 typeWidthInBytes(Dest->getType())));
2422 assert(SrcVar->hasReg()); 2450 assert(SrcVar->hasReg());
2423 assert(Dest->getType() == IceType_i32 || 2451 assert(Dest->getType() == IceType_i32 ||
2424 (InstX86Base<Machine>::Traits::Is64Bit && 2452 (InstX86Base<Machine>::Traits::Is64Bit &&
2425 Dest->getType() == IceType_i64)); 2453 Dest->getType() == IceType_i64));
2426 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = 2454 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2427 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); 2455 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2428 if (Dest->hasReg()) { 2456 if (Dest->hasReg()) {
2429 Asm->movd(Dest->getType(), 2457 Asm->movd(Dest->getType(),
2430 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), 2458 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()),
2431 SrcReg); 2459 SrcReg);
2432 } else { 2460 } else {
2433 typename InstX86Base<Machine>::Traits::Address StackAddr( 2461 typename InstX86Base<Machine>::Traits::Address StackAddr(
2434 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2462 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2435 Func->getTarget()) 2463 Target)
2436 ->stackVarToAsmOperand(Dest)); 2464 ->stackVarToAsmOperand(Dest));
2437 Asm->movd(Dest->getType(), StackAddr, SrcReg); 2465 Asm->movd(Dest->getType(), StackAddr, SrcReg);
2438 } 2466 }
2439 } 2467 }
2440 } 2468 }
2441 2469
2442 template <class Machine> 2470 template <class Machine>
2443 void InstX86Movp<Machine>::emit(const Cfg *Func) const { 2471 void InstX86Movp<Machine>::emit(const Cfg *Func) const {
2444 if (!BuildDefs::dump()) 2472 if (!BuildDefs::dump())
2445 return; 2473 return;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2588 Str << "\tfld" << this->getFldString(Ty) << "\t"; 2616 Str << "\tfld" << this->getFldString(Ty) << "\t";
2589 this->getSrc(0)->emit(Func); 2617 this->getSrc(0)->emit(Func);
2590 } 2618 }
2591 2619
2592 template <class Machine> 2620 template <class Machine>
2593 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { 2621 void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
2594 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2622 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2595 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2623 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2596 assert(this->getSrcSize() == 1); 2624 assert(this->getSrcSize() == 1);
2597 const Operand *Src = this->getSrc(0); 2625 const Operand *Src = this->getSrc(0);
2626 TargetLowering *Target = Func->getTarget();
2598 Type Ty = Src->getType(); 2627 Type Ty = Src->getType();
2599 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { 2628 if (const auto *Var = llvm::dyn_cast<Variable>(Src)) {
2600 if (Var->hasReg()) { 2629 if (Var->hasReg()) {
2601 // This is a physical xmm register, so we need to spill it to a temporary 2630 // This is a physical xmm register, so we need to spill it to a temporary
2602 // stack slot. 2631 // stack slot.
2603 Immediate Width(typeWidthInBytes(Ty)); 2632 Immediate Width(typeWidthInBytes(Ty));
2604 Asm->sub(IceType_i32, 2633 Asm->sub(IceType_i32,
2605 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 2634 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
2606 Width); 2635 Width);
2607 typename InstX86Base<Machine>::Traits::Address StackSlot = 2636 typename InstX86Base<Machine>::Traits::Address StackSlot =
2608 typename InstX86Base<Machine>::Traits::Address( 2637 typename InstX86Base<Machine>::Traits::Address(
2609 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, 2638 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0,
2610 AssemblerFixup::NoFixup); 2639 AssemblerFixup::NoFixup);
2611 Asm->movss(Ty, StackSlot, 2640 Asm->movss(Ty, StackSlot,
2612 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); 2641 InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()));
2613 Asm->fld(Ty, StackSlot); 2642 Asm->fld(Ty, StackSlot);
2614 Asm->add(IceType_i32, 2643 Asm->add(IceType_i32,
2615 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 2644 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
2616 Width); 2645 Width);
2617 } else { 2646 } else {
2618 typename InstX86Base<Machine>::Traits::Address StackAddr( 2647 typename InstX86Base<Machine>::Traits::Address StackAddr(
2619 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2648 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2620 Func->getTarget()) 2649 Target)
2621 ->stackVarToAsmOperand(Var)); 2650 ->stackVarToAsmOperand(Var));
2622 Asm->fld(Ty, StackAddr); 2651 Asm->fld(Ty, StackAddr);
2623 } 2652 }
2624 } else if (const auto *Mem = llvm::dyn_cast< 2653 } else if (const auto *Mem = llvm::dyn_cast<
2625 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { 2654 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
2626 assert(Mem->getSegmentRegister() == 2655 assert(Mem->getSegmentRegister() ==
2627 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 2656 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
2628 Asm->fld(Ty, Mem->toAsmAddress(Asm)); 2657 Asm->fld(Ty, Mem->toAsmAddress(Asm, Target));
2629 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { 2658 } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) {
2630 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); 2659 Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm));
2631 } else { 2660 } else {
2632 llvm_unreachable("Unexpected operand type"); 2661 llvm_unreachable("Unexpected operand type");
2633 } 2662 }
2634 } 2663 }
2635 2664
2636 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const { 2665 template <class Machine> void InstX86Fld<Machine>::dump(const Cfg *Func) const {
2637 if (!BuildDefs::dump()) 2666 if (!BuildDefs::dump())
2638 return; 2667 return;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2710 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2682 assert(this->getSrcSize() == 0); 2711 assert(this->getSrcSize() == 0);
2683 const Variable *Dest = this->getDest(); 2712 const Variable *Dest = this->getDest();
2684 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to 2713 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to
2685 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, 2714 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused,
2686 // the fstp should be kept for the SideEffects of popping the stack. 2715 // the fstp should be kept for the SideEffects of popping the stack.
2687 if (!Dest) { 2716 if (!Dest) {
2688 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); 2717 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0));
2689 return; 2718 return;
2690 } 2719 }
2720 TargetLowering *Target = Func->getTarget();
2691 Type Ty = Dest->getType(); 2721 Type Ty = Dest->getType();
2692 if (!Dest->hasReg()) { 2722 if (!Dest->hasReg()) {
2693 typename InstX86Base<Machine>::Traits::Address StackAddr( 2723 typename InstX86Base<Machine>::Traits::Address StackAddr(
2694 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2724 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2695 Func->getTarget()) 2725 Target)
2696 ->stackVarToAsmOperand(Dest)); 2726 ->stackVarToAsmOperand(Dest));
2697 Asm->fstp(Ty, StackAddr); 2727 Asm->fstp(Ty, StackAddr);
2698 } else { 2728 } else {
2699 // Dest is a physical (xmm) register, so st(0) needs to go through memory. 2729 // Dest is a physical (xmm) register, so st(0) needs to go through memory.
2700 // Hack this by creating a temporary stack slot, spilling st(0) there, 2730 // Hack this by creating a temporary stack slot, spilling st(0) there,
2701 // loading it into the xmm register, and deallocating the stack slot. 2731 // loading it into the xmm register, and deallocating the stack slot.
2702 Immediate Width(typeWidthInBytes(Ty)); 2732 Immediate Width(typeWidthInBytes(Ty));
2703 Asm->sub(IceType_i32, 2733 Asm->sub(IceType_i32,
2704 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); 2734 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width);
2705 typename InstX86Base<Machine>::Traits::Address StackSlot = 2735 typename InstX86Base<Machine>::Traits::Address StackSlot =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2748 this->emitTwoAddress(buf, this, Func); 2778 this->emitTwoAddress(buf, this, Func);
2749 } 2779 }
2750 2780
2751 template <class Machine> 2781 template <class Machine>
2752 void InstX86Pextr<Machine>::emit(const Cfg *Func) const { 2782 void InstX86Pextr<Machine>::emit(const Cfg *Func) const {
2753 if (!BuildDefs::dump()) 2783 if (!BuildDefs::dump())
2754 return; 2784 return;
2755 Ostream &Str = Func->getContext()->getStrEmit(); 2785 Ostream &Str = Func->getContext()->getStrEmit();
2756 assert(this->getSrcSize() == 2); 2786 assert(this->getSrcSize() == 2);
2757 // pextrb and pextrd are SSE4.1 instructions. 2787 // pextrb and pextrd are SSE4.1 instructions.
2788 TargetLowering *Target = Func->getTarget();
2758 assert(this->getSrc(0)->getType() == IceType_v8i16 || 2789 assert(this->getSrc(0)->getType() == IceType_v8i16 ||
2759 this->getSrc(0)->getType() == IceType_v8i1 || 2790 this->getSrc(0)->getType() == IceType_v8i1 ||
2760 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2791 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2761 Func->getTarget()) 2792 Target)
2762 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 2793 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2763 Str << "\t" << this->Opcode 2794 Str << "\t" << this->Opcode
2764 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) 2795 << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
2765 ->getType()] 2796 ->getType()]
2766 .PackString << "\t"; 2797 .PackString << "\t";
2767 this->getSrc(1)->emit(Func); 2798 this->getSrc(1)->emit(Func);
2768 Str << ", "; 2799 Str << ", ";
2769 this->getSrc(0)->emit(Func); 2800 this->getSrc(0)->emit(Func);
2770 Str << ", "; 2801 Str << ", ";
2771 Variable *Dest = this->getDest(); 2802 Variable *Dest = this->getDest();
2772 // pextrw must take a register dest. There is an SSE4.1 version that takes a 2803 // pextrw must take a register dest. There is an SSE4.1 version that takes a
2773 // memory dest, but we aren't using it. For uniformity, just restrict them 2804 // memory dest, but we aren't using it. For uniformity, just restrict them
2774 // all to have a register dest for now. 2805 // all to have a register dest for now.
2775 assert(Dest->hasReg()); 2806 assert(Dest->hasReg());
2776 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); 2807 Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func);
2777 } 2808 }
2778 2809
2779 template <class Machine> 2810 template <class Machine>
2780 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { 2811 void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
2781 assert(this->getSrcSize() == 2); 2812 assert(this->getSrcSize() == 2);
2782 // pextrb and pextrd are SSE4.1 instructions. 2813 // pextrb and pextrd are SSE4.1 instructions.
2783 const Variable *Dest = this->getDest(); 2814 const Variable *Dest = this->getDest();
2784 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( 2815 Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
2785 this->getSrc(0)->getType()); 2816 this->getSrc(0)->getType());
2817 TargetLowering *Target = Func->getTarget();
2786 assert(DispatchTy == IceType_i16 || 2818 assert(DispatchTy == IceType_i16 ||
2787 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2819 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2788 Func->getTarget()) 2820 Target)
2789 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 2821 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2790 // pextrw must take a register dest. There is an SSE4.1 version that takes a 2822 // pextrw must take a register dest. There is an SSE4.1 version that takes a
2791 // memory dest, but we aren't using it. For uniformity, just restrict them 2823 // memory dest, but we aren't using it. For uniformity, just restrict them
2792 // all to have a register dest for now. 2824 // all to have a register dest for now.
2793 assert(Dest->hasReg()); 2825 assert(Dest->hasReg());
2794 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2). 2826 // pextrw's Src(0) must be a register (both SSE4.1 and SSE2).
2795 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg()); 2827 assert(llvm::cast<Variable>(this->getSrc(0))->hasReg());
2796 static const typename InstX86Base<Machine>::Traits::Assembler:: 2828 static const typename InstX86Base<Machine>::Traits::Assembler::
2797 template ThreeOpImmEmitter< 2829 template ThreeOpImmEmitter<
2798 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 2830 typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
2799 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister> 2831 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister>
2800 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr}; 2832 Emitter = {&InstX86Base<Machine>::Traits::Assembler::pextr, nullptr};
2801 emitIASThreeOpImmOps< 2833 emitIASThreeOpImmOps<
2802 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, 2834 Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister,
2803 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, 2835 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister,
2804 InstX86Base<Machine>::Traits::getEncodedGPR, 2836 InstX86Base<Machine>::Traits::getEncodedGPR,
2805 InstX86Base<Machine>::Traits::getEncodedXmm>( 2837 InstX86Base<Machine>::Traits::getEncodedXmm>(
2806 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); 2838 Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter);
2807 } 2839 }
2808 2840
2809 template <class Machine> 2841 template <class Machine>
2810 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { 2842 void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
2811 if (!BuildDefs::dump()) 2843 if (!BuildDefs::dump())
2812 return; 2844 return;
2813 Ostream &Str = Func->getContext()->getStrEmit(); 2845 Ostream &Str = Func->getContext()->getStrEmit();
2814 assert(this->getSrcSize() == 3); 2846 assert(this->getSrcSize() == 3);
2815 // pinsrb and pinsrd are SSE4.1 instructions. 2847 // pinsrb and pinsrd are SSE4.1 instructions.
2848 TargetLowering *Target = Func->getTarget();
2816 assert(this->getDest()->getType() == IceType_v8i16 || 2849 assert(this->getDest()->getType() == IceType_v8i16 ||
2817 this->getDest()->getType() == IceType_v8i1 || 2850 this->getDest()->getType() == IceType_v8i1 ||
2818 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2851 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2819 Func->getTarget()) 2852 Target)
2820 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 2853 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2821 Str << "\t" << this->Opcode 2854 Str << "\t" << this->Opcode
2822 << InstX86Base< 2855 << InstX86Base<
2823 Machine>::Traits::TypeAttributes[this->getDest()->getType()] 2856 Machine>::Traits::TypeAttributes[this->getDest()->getType()]
2824 .PackString << "\t"; 2857 .PackString << "\t";
2825 this->getSrc(2)->emit(Func); 2858 this->getSrc(2)->emit(Func);
2826 Str << ", "; 2859 Str << ", ";
2827 Operand *Src1 = this->getSrc(1); 2860 Operand *Src1 = this->getSrc(1);
2828 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { 2861 if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) {
2829 // If src1 is a register, it should always be r32. 2862 // If src1 is a register, it should always be r32.
(...skipping 12 matching lines...) Expand all
2842 this->getDest()->emit(Func); 2875 this->getDest()->emit(Func);
2843 } 2876 }
2844 2877
2845 template <class Machine> 2878 template <class Machine>
2846 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { 2879 void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
2847 assert(this->getSrcSize() == 3); 2880 assert(this->getSrcSize() == 3);
2848 assert(this->getDest() == this->getSrc(0)); 2881 assert(this->getDest() == this->getSrc(0));
2849 // pinsrb and pinsrd are SSE4.1 instructions. 2882 // pinsrb and pinsrd are SSE4.1 instructions.
2850 const Operand *Src0 = this->getSrc(1); 2883 const Operand *Src0 = this->getSrc(1);
2851 Type DispatchTy = Src0->getType(); 2884 Type DispatchTy = Src0->getType();
2885 TargetLowering *Target = Func->getTarget();
2852 assert(DispatchTy == IceType_i16 || 2886 assert(DispatchTy == IceType_i16 ||
2853 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2887 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2854 Func->getTarget()) 2888 Target)
2855 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1); 2889 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
2856 // If src1 is a register, it should always be r32 (this should fall out from 2890 // If src1 is a register, it should always be r32 (this should fall out from
2857 // the encodings for ByteRegs overlapping the encodings for r32), but we have 2891 // the encodings for ByteRegs overlapping the encodings for r32), but we have
2858 // to make sure the register allocator didn't choose an 8-bit high register 2892 // to make sure the register allocator didn't choose an 8-bit high register
2859 // like "ah". 2893 // like "ah".
2860 if (BuildDefs::asserts()) { 2894 if (BuildDefs::asserts()) {
2861 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { 2895 if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) {
2862 if (Src0Var->hasReg()) { 2896 if (Src0Var->hasReg()) {
2863 int32_t RegNum = Src0Var->getRegNum(); 2897 int32_t RegNum = Src0Var->getRegNum();
2864 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); 2898 int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2932 2966
2933 template <class Machine> 2967 template <class Machine>
2934 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { 2968 void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const {
2935 assert(this->getSrcSize() == 0); 2969 assert(this->getSrcSize() == 0);
2936 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2970 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2937 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2971 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2938 if (this->getDest()->hasReg()) { 2972 if (this->getDest()->hasReg()) {
2939 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( 2973 Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR(
2940 this->getDest()->getRegNum())); 2974 this->getDest()->getRegNum()));
2941 } else { 2975 } else {
2976 TargetLowering *Target = Func->getTarget();
2942 Asm->popl( 2977 Asm->popl(
2943 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 2978 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
2944 Func->getTarget()) 2979 Target)
2945 ->stackVarToAsmOperand(this->getDest())); 2980 ->stackVarToAsmOperand(this->getDest()));
2946 } 2981 }
2947 } 2982 }
2948 2983
2949 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const { 2984 template <class Machine> void InstX86Pop<Machine>::dump(const Cfg *Func) const {
2950 if (!BuildDefs::dump()) 2985 if (!BuildDefs::dump())
2951 return; 2986 return;
2952 Ostream &Str = Func->getContext()->getStrDump(); 2987 Ostream &Str = Func->getContext()->getStrDump();
2953 this->dumpDest(Func); 2988 this->dumpDest(Func);
2954 Str << " = pop." << this->getDest()->getType() << " "; 2989 Str << " = pop." << this->getDest()->getType() << " ";
2955 } 2990 }
2956 2991
2957 template <class Machine> 2992 template <class Machine>
2958 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { 2993 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const {
2959 if (!BuildDefs::dump()) 2994 if (!BuildDefs::dump())
2960 return; 2995 return;
2961 Ostream &Str = Func->getContext()->getStrEmit(); 2996 Ostream &Str = Func->getContext()->getStrEmit();
2962 Str << "\tsubl\t$" << Amount << ", %esp"; 2997 Str << "\tsubl\t$" << Amount << ", %esp";
2963 Func->getTarget()->updateStackAdjustment(Amount); 2998 TargetLowering *Target = Func->getTarget();
2999 Target->updateStackAdjustment(Amount);
2964 } 3000 }
2965 3001
2966 template <class Machine> 3002 template <class Machine>
2967 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { 3003 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const {
2968 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3004 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2969 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3005 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2970 Asm->sub(IceType_i32, 3006 Asm->sub(IceType_i32,
2971 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 3007 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
2972 Immediate(Amount)); 3008 Immediate(Amount));
2973 Func->getTarget()->updateStackAdjustment(Amount); 3009 TargetLowering *Target = Func->getTarget();
3010 Target->updateStackAdjustment(Amount);
2974 } 3011 }
2975 3012
2976 template <class Machine> 3013 template <class Machine>
2977 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { 3014 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const {
2978 if (!BuildDefs::dump()) 3015 if (!BuildDefs::dump())
2979 return; 3016 return;
2980 Ostream &Str = Func->getContext()->getStrDump(); 3017 Ostream &Str = Func->getContext()->getStrDump();
2981 Str << "esp = sub.i32 esp, " << Amount; 3018 Str << "esp = sub.i32 esp, " << Amount;
2982 } 3019 }
2983 3020
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
3093 this->Dest->emit(Func); 3130 this->Dest->emit(Func);
3094 } 3131 }
3095 3132
3096 template <class Machine> 3133 template <class Machine>
3097 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { 3134 void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const {
3098 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None); 3135 assert(Condition != InstX86Base<Machine>::Traits::Cond::Br_None);
3099 assert(this->getDest()->getType() == IceType_i1); 3136 assert(this->getDest()->getType() == IceType_i1);
3100 assert(this->getSrcSize() == 0); 3137 assert(this->getSrcSize() == 0);
3101 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3138 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3102 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3139 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3140 TargetLowering *Target = Func->getTarget();
3103 if (this->getDest()->hasReg()) 3141 if (this->getDest()->hasReg())
3104 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( 3142 Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg(
3105 this->getDest()->getRegNum())); 3143 this->getDest()->getRegNum()));
3106 else 3144 else
3107 Asm->setcc( 3145 Asm->setcc(
3108 Condition, 3146 Condition,
3109 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( 3147 static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
3110 Func->getTarget()) 3148 Target)
3111 ->stackVarToAsmOperand(this->getDest())); 3149 ->stackVarToAsmOperand(this->getDest()));
3112 return; 3150 return;
3113 } 3151 }
3114 3152
3115 template <class Machine> 3153 template <class Machine>
3116 void InstX86Setcc<Machine>::dump(const Cfg *Func) const { 3154 void InstX86Setcc<Machine>::dump(const Cfg *Func) const {
3117 if (!BuildDefs::dump()) 3155 if (!BuildDefs::dump())
3118 return; 3156 return;
3119 Ostream &Str = Func->getContext()->getStrDump(); 3157 Ostream &Str = Func->getContext()->getStrDump();
3120 Str << "setcc." 3158 Str << "setcc."
(...skipping 20 matching lines...) Expand all
3141 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { 3179 void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const {
3142 assert(this->getSrcSize() == 2); 3180 assert(this->getSrcSize() == 2);
3143 typename InstX86Base<Machine>::Traits::Assembler *Asm = 3181 typename InstX86Base<Machine>::Traits::Assembler *Asm =
3144 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 3182 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
3145 Type Ty = this->getSrc(0)->getType(); 3183 Type Ty = this->getSrc(0)->getType();
3146 const auto Mem = 3184 const auto Mem =
3147 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 3185 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
3148 this->getSrc(0)); 3186 this->getSrc(0));
3149 assert(Mem->getSegmentRegister() == 3187 assert(Mem->getSegmentRegister() ==
3150 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 3188 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
3189 TargetLowering *Target = Func->getTarget();
3151 const typename InstX86Base<Machine>::Traits::Address Addr = 3190 const typename InstX86Base<Machine>::Traits::Address Addr =
3152 Mem->toAsmAddress(Asm); 3191 Mem->toAsmAddress(Asm, Target);
3153 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); 3192 const auto *VarReg = llvm::cast<Variable>(this->getSrc(1));
3154 assert(VarReg->hasReg()); 3193 assert(VarReg->hasReg());
3155 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = 3194 const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
3156 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); 3195 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum());
3157 Asm->xadd(Ty, Addr, Reg, this->Locked); 3196 Asm->xadd(Ty, Addr, Reg, this->Locked);
3158 } 3197 }
3159 3198
3160 template <class Machine> 3199 template <class Machine>
3161 void InstX86Xadd<Machine>::dump(const Cfg *Func) const { 3200 void InstX86Xadd<Machine>::dump(const Cfg *Func) const {
3162 if (!BuildDefs::dump()) 3201 if (!BuildDefs::dump())
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3198 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); 3237 InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum());
3199 Asm->xchg(Ty, Reg0, Reg1); 3238 Asm->xchg(Ty, Reg0, Reg1);
3200 return; 3239 return;
3201 } 3240 }
3202 3241
3203 const auto *Mem = 3242 const auto *Mem =
3204 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( 3243 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
3205 this->getSrc(0)); 3244 this->getSrc(0));
3206 assert(Mem->getSegmentRegister() == 3245 assert(Mem->getSegmentRegister() ==
3207 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); 3246 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
3247 TargetLowering *Target = Func->getTarget();
3208 const typename InstX86Base<Machine>::Traits::Address Addr = 3248 const typename InstX86Base<Machine>::Traits::Address Addr =
3209 Mem->toAsmAddress(Asm); 3249 Mem->toAsmAddress(Asm, Target);
3210 Asm->xchg(Ty, Addr, Reg1); 3250 Asm->xchg(Ty, Addr, Reg1);
3211 } 3251 }
3212 3252
3213 template <class Machine> 3253 template <class Machine>
3214 void InstX86Xchg<Machine>::dump(const Cfg *Func) const { 3254 void InstX86Xchg<Machine>::dump(const Cfg *Func) const {
3215 if (!BuildDefs::dump()) 3255 if (!BuildDefs::dump())
3216 return; 3256 return;
3217 Ostream &Str = Func->getContext()->getStrDump(); 3257 Ostream &Str = Func->getContext()->getStrDump();
3218 Type Ty = this->getSrc(0)->getType(); 3258 Type Ty = this->getSrc(0)->getType();
3219 Str << "xchg." << Ty << " "; 3259 Str << "xchg." << Ty << " ";
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3270 return; 3310 return;
3271 Ostream &Str = Func->getContext()->getStrDump(); 3311 Ostream &Str = Func->getContext()->getStrDump();
3272 Str << "IACA_END"; 3312 Str << "IACA_END";
3273 } 3313 }
3274 3314
3275 } // end of namespace X86Internal 3315 } // end of namespace X86Internal
3276 3316
3277 } // end of namespace Ice 3317 } // end of namespace Ice
3278 3318
3279 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H 3319 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H
OLDNEW
« no previous file with comments | « src/IceInstX8664.cpp ('k') | src/IceOperand.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698