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