| //===---- 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 |