xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceTargetLoweringX86.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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 Worker inline 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