1*03ce13f7SAndroid Build Coastguard Worker //===---- subzero/src/IceTargetLoweringX86.h - x86 lowering -*- C++ -*---===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares common functionlity for lowering to the X86 architecture 12*03ce13f7SAndroid Build Coastguard Worker /// (32-bit and 64-bit). 13*03ce13f7SAndroid Build Coastguard Worker /// 14*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 15*03ce13f7SAndroid Build Coastguard Worker 16*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICETARGETLOWERINGX86_H 17*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICETARGETLOWERINGX86_H 18*03ce13f7SAndroid Build Coastguard Worker 19*03ce13f7SAndroid Build Coastguard Worker #include "IceCfg.h" 20*03ce13f7SAndroid Build Coastguard Worker #include "IceTargetLowering.h" 21*03ce13f7SAndroid Build Coastguard Worker 22*03ce13f7SAndroid Build Coastguard Worker #include <inttypes.h> 23*03ce13f7SAndroid Build Coastguard Worker 24*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 25*03ce13f7SAndroid Build Coastguard Worker namespace X86 { 26*03ce13f7SAndroid Build Coastguard Worker 27*03ce13f7SAndroid Build Coastguard Worker enum InstructionSetX86 { 28*03ce13f7SAndroid Build Coastguard Worker Begin, 29*03ce13f7SAndroid Build Coastguard Worker // SSE2 is the baseline instruction set. 30*03ce13f7SAndroid Build Coastguard Worker SSE2 = Begin, 31*03ce13f7SAndroid Build Coastguard Worker SSE4_1, 32*03ce13f7SAndroid Build Coastguard Worker End 33*03ce13f7SAndroid Build Coastguard Worker }; 34*03ce13f7SAndroid Build Coastguard Worker 35*03ce13f7SAndroid Build Coastguard Worker class TargetX86 : public ::Ice::TargetLowering { 36*03ce13f7SAndroid Build Coastguard Worker TargetX86() = delete; 37*03ce13f7SAndroid Build Coastguard Worker TargetX86(const TargetX86 &) = delete; 38*03ce13f7SAndroid Build Coastguard Worker TargetX86 &operator=(const TargetX86 &) = delete; 39*03ce13f7SAndroid Build Coastguard Worker 40*03ce13f7SAndroid Build Coastguard Worker public: 41*03ce13f7SAndroid Build Coastguard Worker ~TargetX86() override = default; 42*03ce13f7SAndroid Build Coastguard Worker getInstructionSet()43*03ce13f7SAndroid Build Coastguard Worker InstructionSetX86 getInstructionSet() const { return InstructionSet; } 44*03ce13f7SAndroid Build Coastguard Worker 45*03ce13f7SAndroid Build Coastguard Worker protected: TargetX86(Cfg * Func)46*03ce13f7SAndroid Build Coastguard Worker explicit TargetX86(Cfg *Func) : TargetLowering(Func) { 47*03ce13f7SAndroid Build Coastguard Worker static_assert((InstructionSetX86::End - InstructionSetX86::Begin) == 48*03ce13f7SAndroid Build Coastguard Worker (TargetInstructionSet::X86InstructionSet_End - 49*03ce13f7SAndroid Build Coastguard Worker TargetInstructionSet::X86InstructionSet_Begin), 50*03ce13f7SAndroid Build Coastguard Worker "InstructionSet range different from TargetInstructionSet"); 51*03ce13f7SAndroid Build Coastguard Worker if (getFlags().getTargetInstructionSet() != 52*03ce13f7SAndroid Build Coastguard Worker TargetInstructionSet::BaseInstructionSet) { 53*03ce13f7SAndroid Build Coastguard Worker InstructionSet = static_cast<InstructionSetX86>( 54*03ce13f7SAndroid Build Coastguard Worker (getFlags().getTargetInstructionSet() - 55*03ce13f7SAndroid Build Coastguard Worker TargetInstructionSet::X86InstructionSet_Begin) + 56*03ce13f7SAndroid Build Coastguard Worker InstructionSetX86::Begin); 57*03ce13f7SAndroid Build Coastguard Worker } 58*03ce13f7SAndroid Build Coastguard Worker } 59*03ce13f7SAndroid Build Coastguard Worker 60*03ce13f7SAndroid Build Coastguard Worker InstructionSetX86 InstructionSet = InstructionSetX86::Begin; 61*03ce13f7SAndroid Build Coastguard Worker 62*03ce13f7SAndroid Build Coastguard Worker private: 63*03ce13f7SAndroid Build Coastguard Worker ENABLE_MAKE_UNIQUE; 64*03ce13f7SAndroid Build Coastguard Worker }; 65*03ce13f7SAndroid Build Coastguard Worker getInstructionSet(const Cfg * Func)66*03ce13f7SAndroid Build Coastguard Workerinline InstructionSetX86 getInstructionSet(const Cfg *Func) { 67*03ce13f7SAndroid Build Coastguard Worker return reinterpret_cast<TargetX86 *>(Func->getTarget())->getInstructionSet(); 68*03ce13f7SAndroid Build Coastguard Worker } 69*03ce13f7SAndroid Build Coastguard Worker 70*03ce13f7SAndroid Build Coastguard Worker template <typename T> struct PoolTypeConverter {}; 71*03ce13f7SAndroid Build Coastguard Worker 72*03ce13f7SAndroid Build Coastguard Worker template <> struct PoolTypeConverter<float> { 73*03ce13f7SAndroid Build Coastguard Worker using PrimitiveIntType = uint32_t; 74*03ce13f7SAndroid Build Coastguard Worker using IceType = ConstantFloat; 75*03ce13f7SAndroid Build Coastguard Worker static constexpr Type Ty = IceType_f32; 76*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *TypeName = "float"; 77*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *AsmTag = ".long"; 78*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *PrintfString = "0x%x"; 79*03ce13f7SAndroid Build Coastguard Worker }; 80*03ce13f7SAndroid Build Coastguard Worker 81*03ce13f7SAndroid Build Coastguard Worker template <> struct PoolTypeConverter<double> { 82*03ce13f7SAndroid Build Coastguard Worker using PrimitiveIntType = uint64_t; 83*03ce13f7SAndroid Build Coastguard Worker using IceType = ConstantDouble; 84*03ce13f7SAndroid Build Coastguard Worker static constexpr Type Ty = IceType_f64; 85*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *TypeName = "double"; 86*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *AsmTag = ".quad"; 87*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *PrintfString = "%" PRIu64; 88*03ce13f7SAndroid Build Coastguard Worker }; 89*03ce13f7SAndroid Build Coastguard Worker 90*03ce13f7SAndroid Build Coastguard Worker // Add converter for int type constant pooling 91*03ce13f7SAndroid Build Coastguard Worker template <> struct PoolTypeConverter<uint32_t> { 92*03ce13f7SAndroid Build Coastguard Worker using PrimitiveIntType = uint32_t; 93*03ce13f7SAndroid Build Coastguard Worker using IceType = ConstantInteger32; 94*03ce13f7SAndroid Build Coastguard Worker static constexpr Type Ty = IceType_i32; 95*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *TypeName = "i32"; 96*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *AsmTag = ".long"; 97*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *PrintfString = "0x%x"; 98*03ce13f7SAndroid Build Coastguard Worker }; 99*03ce13f7SAndroid Build Coastguard Worker 100*03ce13f7SAndroid Build Coastguard Worker // Add converter for int type constant pooling 101*03ce13f7SAndroid Build Coastguard Worker template <> struct PoolTypeConverter<uint16_t> { 102*03ce13f7SAndroid Build Coastguard Worker using PrimitiveIntType = uint32_t; 103*03ce13f7SAndroid Build Coastguard Worker using IceType = ConstantInteger32; 104*03ce13f7SAndroid Build Coastguard Worker static constexpr Type Ty = IceType_i16; 105*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *TypeName = "i16"; 106*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *AsmTag = ".short"; 107*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *PrintfString = "0x%x"; 108*03ce13f7SAndroid Build Coastguard Worker }; 109*03ce13f7SAndroid Build Coastguard Worker 110*03ce13f7SAndroid Build Coastguard Worker // Add converter for int type constant pooling 111*03ce13f7SAndroid Build Coastguard Worker template <> struct PoolTypeConverter<uint8_t> { 112*03ce13f7SAndroid Build Coastguard Worker using PrimitiveIntType = uint32_t; 113*03ce13f7SAndroid Build Coastguard Worker using IceType = ConstantInteger32; 114*03ce13f7SAndroid Build Coastguard Worker static constexpr Type Ty = IceType_i8; 115*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *TypeName = "i8"; 116*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *AsmTag = ".byte"; 117*03ce13f7SAndroid Build Coastguard Worker static constexpr const char *PrintfString = "0x%x"; 118*03ce13f7SAndroid Build Coastguard Worker }; 119*03ce13f7SAndroid Build Coastguard Worker 120*03ce13f7SAndroid Build Coastguard Worker } // end of namespace X86 121*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 122*03ce13f7SAndroid Build Coastguard Worker 123*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632_H 124