|  | //===---- subzero/src/IceTargetLoweringX86.h - x86 lowering -*- C++ -*---===// | 
|  | // | 
|  | //                        The Subzero Code Generator | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// \brief Declares common functionlity for lowering to the X86 architecture | 
|  | /// (32-bit and 64-bit). | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef SUBZERO_SRC_ICETARGETLOWERINGX86_H | 
|  | #define SUBZERO_SRC_ICETARGETLOWERINGX86_H | 
|  |  | 
|  | #include "IceCfg.h" | 
|  | #include "IceTargetLowering.h" | 
|  |  | 
|  | #include <inttypes.h> | 
|  |  | 
|  | namespace Ice { | 
|  | namespace X86 { | 
|  |  | 
|  | enum InstructionSetX86 { | 
|  | Begin, | 
|  | // SSE2 is the baseline instruction set. | 
|  | SSE2 = Begin, | 
|  | SSE4_1, | 
|  | End | 
|  | }; | 
|  |  | 
|  | class TargetX86 : public ::Ice::TargetLowering { | 
|  | TargetX86() = delete; | 
|  | TargetX86(const TargetX86 &) = delete; | 
|  | TargetX86 &operator=(const TargetX86 &) = delete; | 
|  |  | 
|  | public: | 
|  | ~TargetX86() override = default; | 
|  |  | 
|  | InstructionSetX86 getInstructionSet() const { return InstructionSet; } | 
|  |  | 
|  | protected: | 
|  | explicit TargetX86(Cfg *Func) : TargetLowering(Func) { | 
|  | static_assert((InstructionSetX86::End - InstructionSetX86::Begin) == | 
|  | (TargetInstructionSet::X86InstructionSet_End - | 
|  | TargetInstructionSet::X86InstructionSet_Begin), | 
|  | "InstructionSet range different from TargetInstructionSet"); | 
|  | if (getFlags().getTargetInstructionSet() != | 
|  | TargetInstructionSet::BaseInstructionSet) { | 
|  | InstructionSet = static_cast<InstructionSetX86>( | 
|  | (getFlags().getTargetInstructionSet() - | 
|  | TargetInstructionSet::X86InstructionSet_Begin) + | 
|  | InstructionSetX86::Begin); | 
|  | } | 
|  | } | 
|  |  | 
|  | InstructionSetX86 InstructionSet = InstructionSetX86::Begin; | 
|  |  | 
|  | private: | 
|  | ENABLE_MAKE_UNIQUE; | 
|  | }; | 
|  |  | 
|  | inline InstructionSetX86 getInstructionSet(const Cfg *Func) { | 
|  | return reinterpret_cast<TargetX86 *>(Func->getTarget())->getInstructionSet(); | 
|  | } | 
|  |  | 
|  | template <typename T> struct PoolTypeConverter {}; | 
|  |  | 
|  | template <> struct PoolTypeConverter<float> { | 
|  | using PrimitiveIntType = uint32_t; | 
|  | using IceType = ConstantFloat; | 
|  | static constexpr Type Ty = IceType_f32; | 
|  | static constexpr const char *TypeName = "float"; | 
|  | static constexpr const char *AsmTag = ".long"; | 
|  | static constexpr const char *PrintfString = "0x%x"; | 
|  | }; | 
|  |  | 
|  | template <> struct PoolTypeConverter<double> { | 
|  | using PrimitiveIntType = uint64_t; | 
|  | using IceType = ConstantDouble; | 
|  | static constexpr Type Ty = IceType_f64; | 
|  | static constexpr const char *TypeName = "double"; | 
|  | static constexpr const char *AsmTag = ".quad"; | 
|  | static constexpr const char *PrintfString = "%" PRIu64; | 
|  | }; | 
|  |  | 
|  | // Add converter for int type constant pooling | 
|  | template <> struct PoolTypeConverter<uint32_t> { | 
|  | using PrimitiveIntType = uint32_t; | 
|  | using IceType = ConstantInteger32; | 
|  | static constexpr Type Ty = IceType_i32; | 
|  | static constexpr const char *TypeName = "i32"; | 
|  | static constexpr const char *AsmTag = ".long"; | 
|  | static constexpr const char *PrintfString = "0x%x"; | 
|  | }; | 
|  |  | 
|  | // Add converter for int type constant pooling | 
|  | template <> struct PoolTypeConverter<uint16_t> { | 
|  | using PrimitiveIntType = uint32_t; | 
|  | using IceType = ConstantInteger32; | 
|  | static constexpr Type Ty = IceType_i16; | 
|  | static constexpr const char *TypeName = "i16"; | 
|  | static constexpr const char *AsmTag = ".short"; | 
|  | static constexpr const char *PrintfString = "0x%x"; | 
|  | }; | 
|  |  | 
|  | // Add converter for int type constant pooling | 
|  | template <> struct PoolTypeConverter<uint8_t> { | 
|  | using PrimitiveIntType = uint32_t; | 
|  | using IceType = ConstantInteger32; | 
|  | static constexpr Type Ty = IceType_i8; | 
|  | static constexpr const char *TypeName = "i8"; | 
|  | static constexpr const char *AsmTag = ".byte"; | 
|  | static constexpr const char *PrintfString = "0x%x"; | 
|  | }; | 
|  |  | 
|  | } // end of namespace X86 | 
|  | } // end of namespace Ice | 
|  |  | 
|  | #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632_H |