OLD | NEW |
---|---|
1 //===- subzero/src/IceInstX86Base.h - Generic x86 instructions -*- C++ -*--===// | 1 //===- subzero/src/IceInstX86Base.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 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
757 InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete; | 757 InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete; |
758 InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete; | 758 InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete; |
759 | 759 |
760 public: | 760 public: |
761 using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType, Suffix>; | 761 using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType, Suffix>; |
762 | 762 |
763 void emit(const Cfg *Func) const override { | 763 void emit(const Cfg *Func) const override { |
764 if (!BuildDefs::dump()) | 764 if (!BuildDefs::dump()) |
765 return; | 765 return; |
766 this->validateVectorAddrMode(); | 766 this->validateVectorAddrMode(); |
767 Type DestTy = this->getDest()->getType(); | |
768 const char *SuffixString = ""; | |
769 if (ArithmeticTypeOverride != IceType_void) | |
770 DestTy = ArithmeticTypeOverride; | |
771 | |
767 switch (Suffix) { | 772 switch (Suffix) { |
768 case InstX86Base<Machine>::SseSuffix::None: | 773 case InstX86Base<Machine>::SseSuffix::None: |
769 this->emitTwoAddress(Func, Opcode); | |
770 break; | 774 break; |
771 case InstX86Base<Machine>::SseSuffix::Packed: { | 775 case InstX86Base<Machine>::SseSuffix::Packed: |
772 const Type DestTy = this->getDest()->getType(); | 776 SuffixString = |
773 this->emitTwoAddress( | 777 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString; |
774 Func, this->Opcode, | 778 break; |
775 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString); | 779 case InstX86Base<Machine>::SseSuffix::Scalar: |
776 } break; | 780 SuffixString = |
777 case InstX86Base<Machine>::SseSuffix::Scalar: { | 781 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString; |
778 const Type DestTy = this->getDest()->getType(); | 782 break; |
779 this->emitTwoAddress( | 783 case InstX86Base<Machine>::SseSuffix::Integral: |
780 Func, this->Opcode, | 784 SuffixString = |
781 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString); | 785 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PackString; |
782 } break; | 786 break; |
783 case InstX86Base<Machine>::SseSuffix::Integral: { | |
784 const Type DestTy = this->getDest()->getType(); | |
785 this->emitTwoAddress( | |
786 Func, this->Opcode, | |
787 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PackString); | |
788 } break; | |
789 } | 787 } |
788 this->emitTwoAddress(Func, Opcode, SuffixString); | |
790 } | 789 } |
791 void emitIAS(const Cfg *Func) const override { | 790 void emitIAS(const Cfg *Func) const override { |
792 this->validateVectorAddrMode(); | 791 this->validateVectorAddrMode(); |
793 Type Ty = this->getDest()->getType(); | 792 Type Ty = this->getDest()->getType(); |
794 if (NeedsElementType) | 793 if (NeedsElementType) |
795 Ty = typeElementType(Ty); | 794 Ty = typeElementType(Ty); |
796 assert(this->getSrcSize() == 2); | 795 assert(this->getSrcSize() == 2); |
797 emitIASRegOpTyXMM<Machine>(Func, Ty, this->getDest(), this->getSrc(1), | 796 emitIASRegOpTyXMM<Machine>(Func, Ty, this->getDest(), this->getSrc(1), |
798 Emitter); | 797 Emitter); |
799 } | 798 } |
800 void dump(const Cfg *Func) const override { | 799 void dump(const Cfg *Func) const override { |
801 if (!BuildDefs::dump()) | 800 if (!BuildDefs::dump()) |
802 return; | 801 return; |
803 Ostream &Str = Func->getContext()->getStrDump(); | 802 Ostream &Str = Func->getContext()->getStrDump(); |
804 this->dumpDest(Func); | 803 this->dumpDest(Func); |
805 Str << " = " << Opcode << "." << this->getDest()->getType() << " "; | 804 Str << " = " << Opcode << "." << this->getDest()->getType() << " "; |
806 this->dumpSources(Func); | 805 this->dumpSources(Func); |
807 } | 806 } |
808 static bool classof(const Inst *Inst) { | 807 static bool classof(const Inst *Inst) { |
809 return InstX86Base<Machine>::isClassof(Inst, InstX86Base<Machine>::K); | 808 return InstX86Base<Machine>::isClassof(Inst, InstX86Base<Machine>::K); |
810 } | 809 } |
811 | 810 |
812 protected: | 811 protected: |
813 InstX86BaseBinopXmm(Cfg *Func, Variable *Dest, Operand *Source) | 812 InstX86BaseBinopXmm(Cfg *Func, Variable *Dest, Operand *Source, |
813 Type ArithmeticType = IceType_void) | |
814 : InstX86Base<Machine>(Func, K, 2, Dest) { | 814 : InstX86Base<Machine>(Func, K, 2, Dest) { |
815 this->addSource(Dest); | 815 this->addSource(Dest); |
816 this->addSource(Source); | 816 this->addSource(Source); |
817 ArithmeticTypeOverride = ArithmeticType; | |
Jim Stichnoth
2015/12/20 18:42:23
Can this assignment be moved into the ctor member
sehr
2016/01/07 18:53:11
Done.
| |
817 } | 818 } |
818 | 819 |
820 Type ArithmeticTypeOverride; | |
819 static const char *Opcode; | 821 static const char *Opcode; |
820 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp | 822 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
821 Emitter; | 823 Emitter; |
822 }; | 824 }; |
823 | 825 |
824 template <class Machine> | 826 template <class Machine> |
825 void emitIASXmmShift( | 827 void emitIASXmmShift( |
826 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, | 828 const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src, |
827 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp | 829 const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp |
828 &Emitter); | 830 &Emitter); |
(...skipping 1174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2003 InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source) | 2005 InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source) |
2004 : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>( | 2006 : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>( |
2005 Func, Dest, Source) {} | 2007 Func, Dest, Source) {} |
2006 }; | 2008 }; |
2007 | 2009 |
2008 template <class Machine> | 2010 template <class Machine> |
2009 class InstX86Pcmpeq | 2011 class InstX86Pcmpeq |
2010 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, | 2012 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
2011 InstX86Base<Machine>::SseSuffix::Integral> { | 2013 InstX86Base<Machine>::SseSuffix::Integral> { |
2012 public: | 2014 public: |
2013 static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) { | 2015 static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source, |
2016 Type ArithmeticTypeOverride = IceType_void) { | |
2017 Type Ty = Dest->getType(); | |
2018 if (ArithmeticTypeOverride != IceType_void) | |
2019 Ty = ArithmeticTypeOverride; | |
2020 (void)Ty; | |
2021 assert((Ty != IceType_f64 && Ty != IceType_i64) || | |
2022 InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= | |
2023 InstX86Base<Machine>::Traits::SSE4_1); | |
2014 return new (Func->allocate<InstX86Pcmpeq>()) | 2024 return new (Func->allocate<InstX86Pcmpeq>()) |
2015 InstX86Pcmpeq(Func, Dest, Source); | 2025 InstX86Pcmpeq(Func, Dest, Source, ArithmeticTypeOverride); |
2016 } | 2026 } |
2017 | 2027 |
2018 private: | 2028 private: |
2019 InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source) | 2029 InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source, |
2030 Type ArithmeticTypeOverride) | |
2020 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, | 2031 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
2021 InstX86Base<Machine>::SseSuffix::Integral>( | 2032 InstX86Base<Machine>::SseSuffix::Integral>( |
2022 Func, Dest, Source) {} | 2033 Func, Dest, Source, ArithmeticTypeOverride) {} |
2023 }; | 2034 }; |
2024 | 2035 |
2025 template <class Machine> | 2036 template <class Machine> |
2026 class InstX86Pcmpgt | 2037 class InstX86Pcmpgt |
2027 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, | 2038 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, |
2028 InstX86Base<Machine>::SseSuffix::Integral> { | 2039 InstX86Base<Machine>::SseSuffix::Integral> { |
2029 public: | 2040 public: |
2030 static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { | 2041 static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { |
2042 assert(Dest->getType() != IceType_f64 || | |
2043 InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= | |
2044 InstX86Base<Machine>::Traits::SSE4_1); | |
2031 return new (Func->allocate<InstX86Pcmpgt>()) | 2045 return new (Func->allocate<InstX86Pcmpgt>()) |
2032 InstX86Pcmpgt(Func, Dest, Source); | 2046 InstX86Pcmpgt(Func, Dest, Source); |
2033 } | 2047 } |
2034 | 2048 |
2035 private: | 2049 private: |
2036 InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source) | 2050 InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source) |
2037 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, | 2051 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, |
2038 InstX86Base<Machine>::SseSuffix::Integral>( | 2052 InstX86Base<Machine>::SseSuffix::Integral>( |
2039 Func, Dest, Source) {} | 2053 Func, Dest, Source) {} |
2040 }; | 2054 }; |
(...skipping 1392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3433 &InstX86Base<Machine>::Traits::Assembler::psrl}; \ | 3447 &InstX86Base<Machine>::Traits::Assembler::psrl}; \ |
3434 } \ | 3448 } \ |
3435 } | 3449 } |
3436 | 3450 |
3437 } // end of namespace X86Internal | 3451 } // end of namespace X86Internal |
3438 } // end of namespace Ice | 3452 } // end of namespace Ice |
3439 | 3453 |
3440 #include "IceInstX86BaseImpl.h" | 3454 #include "IceInstX86BaseImpl.h" |
3441 | 3455 |
3442 #endif // SUBZERO_SRC_ICEINSTX86BASE_H | 3456 #endif // SUBZERO_SRC_ICEINSTX86BASE_H |
OLD | NEW |