| OLD | NEW | 
|---|
| 1 //===- subzero/src/IceInst.h - High-level instructions ----------*- C++ -*-===// | 1 //===- subzero/src/IceInst.h - High-level 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 | 
| 11 /// \brief Declares the Inst class and its target-independent subclasses. | 11 /// \brief Declares the Inst class and its target-independent subclasses. | 
| 12 /// | 12 /// | 
| 13 /// These represent the high-level Vanilla ICE instructions and map roughly 1:1 | 13 /// These represent the high-level Vanilla ICE instructions and map roughly 1:1 | 
| 14 /// to LLVM instructions. | 14 /// to LLVM instructions. | 
| 15 /// | 15 /// | 
| 16 //===----------------------------------------------------------------------===// | 16 //===----------------------------------------------------------------------===// | 
| 17 | 17 | 
| 18 #ifndef SUBZERO_SRC_ICEINST_H | 18 #ifndef SUBZERO_SRC_ICEINST_H | 
| 19 #define SUBZERO_SRC_ICEINST_H | 19 #define SUBZERO_SRC_ICEINST_H | 
| 20 | 20 | 
| 21 #include "IceCfg.h" | 21 #include "IceCfg.h" | 
| 22 #include "IceDefs.h" | 22 #include "IceDefs.h" | 
| 23 #include "IceInst.def" | 23 #include "IceInst.def" | 
| 24 #include "IceIntrinsics.h" | 24 #include "IceIntrinsics.h" | 
|  | 25 #include "IceOperand.h" | 
| 25 #include "IceSwitchLowering.h" | 26 #include "IceSwitchLowering.h" | 
| 26 #include "IceTypes.h" | 27 #include "IceTypes.h" | 
| 27 | 28 | 
| 28 // TODO: The Cfg structure, and instructions in particular, need to be | 29 // TODO: The Cfg structure, and instructions in particular, need to be | 
| 29 // validated for things like valid operand types, valid branch targets, proper | 30 // validated for things like valid operand types, valid branch targets, proper | 
| 30 // ordering of Phi and non-Phi instructions, etc. Most of the validity checking | 31 // ordering of Phi and non-Phi instructions, etc. Most of the validity checking | 
| 31 // will be done in the bitcode reader. We need a list of everything that should | 32 // will be done in the bitcode reader. We need a list of everything that should | 
| 32 // be validated, and tests for each. | 33 // be validated, and tests for each. | 
| 33 | 34 | 
| 34 namespace Ice { | 35 namespace Ice { | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 54     Fcmp, | 55     Fcmp, | 
| 55     Icmp, | 56     Icmp, | 
| 56     IntrinsicCall, | 57     IntrinsicCall, | 
| 57     InsertElement, | 58     InsertElement, | 
| 58     Load, | 59     Load, | 
| 59     Phi, | 60     Phi, | 
| 60     Ret, | 61     Ret, | 
| 61     Select, | 62     Select, | 
| 62     Store, | 63     Store, | 
| 63     Switch, | 64     Switch, | 
| 64     Assign,       // not part of LLVM/PNaCl bitcode | 65     Assign,        // not part of LLVM/PNaCl bitcode | 
| 65     Breakpoint,   // not part of LLVM/PNaCl bitcode | 66     Breakpoint,    // not part of LLVM/PNaCl bitcode | 
| 66     BundleLock,   // not part of LLVM/PNaCl bitcode | 67     BundleLock,    // not part of LLVM/PNaCl bitcode | 
| 67     BundleUnlock, // not part of LLVM/PNaCl bitcode | 68     BundleUnlock,  // not part of LLVM/PNaCl bitcode | 
| 68     FakeDef,      // not part of LLVM/PNaCl bitcode | 69     FakeDef,       // not part of LLVM/PNaCl bitcode | 
| 69     FakeUse,      // not part of LLVM/PNaCl bitcode | 70     FakeUse,       // not part of LLVM/PNaCl bitcode | 
| 70     FakeKill,     // not part of LLVM/PNaCl bitcode | 71     FakeKill,      // not part of LLVM/PNaCl bitcode | 
| 71     JumpTable,    // not part of LLVM/PNaCl bitcode | 72     JumpTable,     // not part of LLVM/PNaCl bitcode | 
|  | 73     ShuffleVector, // not part of LLVM/PNaCl bitcode | 
| 72     // Anything >= Target is an InstTarget subclass. Note that the value-spaces | 74     // Anything >= Target is an InstTarget subclass. Note that the value-spaces | 
| 73     // are shared across targets. To avoid confusion over the definition of | 75     // are shared across targets. To avoid confusion over the definition of | 
| 74     // shared values, an object specific to one target should never be passed | 76     // shared values, an object specific to one target should never be passed | 
| 75     // to a different target. | 77     // to a different target. | 
| 76     Target, | 78     Target, | 
| 77     Target_Max = std::numeric_limits<uint8_t>::max(), | 79     Target_Max = std::numeric_limits<uint8_t>::max(), | 
| 78   }; | 80   }; | 
| 79   static_assert(Target <= Target_Max, "Must not be above max."); | 81   static_assert(Target <= Target_Max, "Must not be above max."); | 
| 80   InstKind getKind() const { return Kind; } | 82   InstKind getKind() const { return Kind; } | 
| 81   virtual const char *getInstName() const; | 83   virtual const char *getInstName() const; | 
| (...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 910     return Instr->getKind() == FakeKill; | 912     return Instr->getKind() == FakeKill; | 
| 911   } | 913   } | 
| 912 | 914 | 
| 913 private: | 915 private: | 
| 914   InstFakeKill(Cfg *Func, const Inst *Linked); | 916   InstFakeKill(Cfg *Func, const Inst *Linked); | 
| 915 | 917 | 
| 916   /// This instruction is ignored if Linked->isDeleted() is true. | 918   /// This instruction is ignored if Linked->isDeleted() is true. | 
| 917   const Inst *Linked; | 919   const Inst *Linked; | 
| 918 }; | 920 }; | 
| 919 | 921 | 
|  | 922 /// ShuffleVector instruction. This represents a shuffle operation on vector | 
|  | 923 /// types. This instruction is not part of the PNaCl bitcode: it is generated | 
|  | 924 /// by Subzero when it matches the pattern used by pnacl-clang when compiling | 
|  | 925 /// to bitcode. | 
|  | 926 class InstShuffleVector : public InstHighLevel { | 
|  | 927   InstShuffleVector() = delete; | 
|  | 928   InstShuffleVector(const InstShuffleVector &) = delete; | 
|  | 929   InstShuffleVector &operator=(const InstShuffleVector &) = delete; | 
|  | 930 | 
|  | 931 public: | 
|  | 932   static InstShuffleVector *create(Cfg *Func, Variable *Dest, Variable *Src0, | 
|  | 933                                    Variable *Src1) { | 
|  | 934     return new (Func->allocate<InstShuffleVector>()) | 
|  | 935         InstShuffleVector(Func, Dest, Src0, Src1); | 
|  | 936   } | 
|  | 937 | 
|  | 938   SizeT getNumIndexes() const { return NumIndexes; } | 
|  | 939 | 
|  | 940   void addIndex(ConstantInteger32 *Index) { | 
|  | 941     assert(CurrentIndex < NumIndexes); | 
|  | 942     Indexes[CurrentIndex++] = Index; | 
|  | 943   } | 
|  | 944 | 
|  | 945   ConstantInteger32 *getIndex(SizeT Pos) const { | 
|  | 946     assert(Pos < NumIndexes); | 
|  | 947     return Indexes[Pos]; | 
|  | 948   } | 
|  | 949 | 
|  | 950   void dump(const Cfg *Func) const override; | 
|  | 951   static bool classof(const Inst *Instr) { | 
|  | 952     return Instr->getKind() == ShuffleVector; | 
|  | 953   } | 
|  | 954 | 
|  | 955 private: | 
|  | 956   InstShuffleVector(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1); | 
|  | 957 | 
|  | 958   void destroy(Cfg *Func) override { | 
|  | 959     Func->deallocateArrayOf<ConstantInteger32 *>(Indexes); | 
|  | 960     Inst::destroy(Func); | 
|  | 961   } | 
|  | 962 | 
|  | 963   ConstantInteger32 **Indexes; | 
|  | 964   SizeT CurrentIndex = 0; | 
|  | 965   const SizeT NumIndexes; | 
|  | 966 }; | 
|  | 967 | 
| 920 /// JumpTable instruction. This represents a jump table that will be stored in | 968 /// JumpTable instruction. This represents a jump table that will be stored in | 
| 921 /// the .rodata section. This is used to track and repoint the target CfgNodes | 969 /// the .rodata section. This is used to track and repoint the target CfgNodes | 
| 922 /// which may change, for example due to splitting for phi lowering. | 970 /// which may change, for example due to splitting for phi lowering. | 
| 923 class InstJumpTable : public InstHighLevel { | 971 class InstJumpTable : public InstHighLevel { | 
| 924   InstJumpTable() = delete; | 972   InstJumpTable() = delete; | 
| 925   InstJumpTable(const InstJumpTable &) = delete; | 973   InstJumpTable(const InstJumpTable &) = delete; | 
| 926   InstJumpTable &operator=(const InstJumpTable &) = delete; | 974   InstJumpTable &operator=(const InstJumpTable &) = delete; | 
| 927 | 975 | 
| 928 public: | 976 public: | 
| 929   static InstJumpTable *create(Cfg *Func, SizeT NumTargets, CfgNode *Default) { | 977   static InstJumpTable *create(Cfg *Func, SizeT NumTargets, CfgNode *Default) { | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1039   static void noteHead(Ice::Inst *, Ice::Inst *) {} | 1087   static void noteHead(Ice::Inst *, Ice::Inst *) {} | 
| 1040   void deleteNode(Ice::Inst *) {} | 1088   void deleteNode(Ice::Inst *) {} | 
| 1041 | 1089 | 
| 1042 private: | 1090 private: | 
| 1043   mutable ilist_half_node<Ice::Inst> Sentinel; | 1091   mutable ilist_half_node<Ice::Inst> Sentinel; | 
| 1044 }; | 1092 }; | 
| 1045 | 1093 | 
| 1046 } // end of namespace llvm | 1094 } // end of namespace llvm | 
| 1047 | 1095 | 
| 1048 #endif // SUBZERO_SRC_ICEINST_H | 1096 #endif // SUBZERO_SRC_ICEINST_H | 
| OLD | NEW | 
|---|