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