| OLD | NEW |
| 1 //===- subzero/src/IceOperand.h - High-level operands -----------*- C++ -*-===// | 1 //===- subzero/src/IceOperand.h - High-level operands -----------*- 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 // This file declares the Operand class and its target-independent | 10 // This file declares the Operand class and its target-independent |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 Op.dump(Str); | 95 Op.dump(Str); |
| 96 return Str; | 96 return Str; |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Constant is the abstract base class for constants. All | 99 // Constant is the abstract base class for constants. All |
| 100 // constants are allocated from a global arena and are pooled. | 100 // constants are allocated from a global arena and are pooled. |
| 101 class Constant : public Operand { | 101 class Constant : public Operand { |
| 102 public: | 102 public: |
| 103 uint32_t getPoolEntryID() const { return PoolEntryID; } | 103 uint32_t getPoolEntryID() const { return PoolEntryID; } |
| 104 using Operand::dump; | 104 using Operand::dump; |
| 105 virtual void emit(const Cfg *Func) const { emit(Func->getContext()); } | 105 void emit(const Cfg *Func) const override { emit(Func->getContext()); } |
| 106 virtual void emit(GlobalContext *Ctx) const = 0; | 106 virtual void emit(GlobalContext *Ctx) const = 0; |
| 107 virtual void dump(const Cfg *Func, Ostream &Str) const = 0; | 107 void dump(const Cfg *Func, Ostream &Str) const = 0; |
| 108 | 108 |
| 109 static bool classof(const Operand *Operand) { | 109 static bool classof(const Operand *Operand) { |
| 110 OperandKind Kind = Operand->getKind(); | 110 OperandKind Kind = Operand->getKind(); |
| 111 return Kind >= kConst_Base && Kind <= kConst_Num; | 111 return Kind >= kConst_Base && Kind <= kConst_Num; |
| 112 } | 112 } |
| 113 | 113 |
| 114 protected: | 114 protected: |
| 115 Constant(OperandKind Kind, Type Ty, uint32_t PoolEntryID) | 115 Constant(OperandKind Kind, Type Ty, uint32_t PoolEntryID) |
| 116 : Operand(Kind, Ty), PoolEntryID(PoolEntryID) { | 116 : Operand(Kind, Ty), PoolEntryID(PoolEntryID) { |
| 117 Vars = NULL; | 117 Vars = NULL; |
| 118 NumVars = 0; | 118 NumVars = 0; |
| 119 } | 119 } |
| 120 virtual ~Constant() {} | 120 ~Constant() override {} |
| 121 // PoolEntryID is an integer that uniquely identifies the constant | 121 // PoolEntryID is an integer that uniquely identifies the constant |
| 122 // within its constant pool. It is used for building the constant | 122 // within its constant pool. It is used for building the constant |
| 123 // pool in the object code and for referencing its entries. | 123 // pool in the object code and for referencing its entries. |
| 124 const uint32_t PoolEntryID; | 124 const uint32_t PoolEntryID; |
| 125 | 125 |
| 126 private: | 126 private: |
| 127 Constant(const Constant &) LLVM_DELETED_FUNCTION; | 127 Constant(const Constant &) LLVM_DELETED_FUNCTION; |
| 128 Constant &operator=(const Constant &) LLVM_DELETED_FUNCTION; | 128 Constant &operator=(const Constant &) LLVM_DELETED_FUNCTION; |
| 129 }; | 129 }; |
| 130 | 130 |
| 131 // ConstantPrimitive<> wraps a primitive type. | 131 // ConstantPrimitive<> wraps a primitive type. |
| 132 template <typename T, Operand::OperandKind K> | 132 template <typename T, Operand::OperandKind K> |
| 133 class ConstantPrimitive : public Constant { | 133 class ConstantPrimitive : public Constant { |
| 134 public: | 134 public: |
| 135 static ConstantPrimitive *create(GlobalContext *Ctx, Type Ty, T Value, | 135 static ConstantPrimitive *create(GlobalContext *Ctx, Type Ty, T Value, |
| 136 uint32_t PoolEntryID) { | 136 uint32_t PoolEntryID) { |
| 137 return new (Ctx->allocate<ConstantPrimitive>()) | 137 return new (Ctx->allocate<ConstantPrimitive>()) |
| 138 ConstantPrimitive(Ty, Value, PoolEntryID); | 138 ConstantPrimitive(Ty, Value, PoolEntryID); |
| 139 } | 139 } |
| 140 T getValue() const { return Value; } | 140 T getValue() const { return Value; } |
| 141 using Constant::emit; | 141 using Constant::emit; |
| 142 // The target needs to implement this for each ConstantPrimitive | 142 // The target needs to implement this for each ConstantPrimitive |
| 143 // specialization. | 143 // specialization. |
| 144 virtual void emit(GlobalContext *Ctx) const; | 144 void emit(GlobalContext *Ctx) const override; |
| 145 using Constant::dump; | 145 using Constant::dump; |
| 146 virtual void dump(const Cfg *, Ostream &Str) const { Str << getValue(); } | 146 void dump(const Cfg *, Ostream &Str) const override { Str << getValue(); } |
| 147 | 147 |
| 148 static bool classof(const Operand *Operand) { | 148 static bool classof(const Operand *Operand) { |
| 149 return Operand->getKind() == K; | 149 return Operand->getKind() == K; |
| 150 } | 150 } |
| 151 | 151 |
| 152 private: | 152 private: |
| 153 ConstantPrimitive(Type Ty, T Value, uint32_t PoolEntryID) | 153 ConstantPrimitive(Type Ty, T Value, uint32_t PoolEntryID) |
| 154 : Constant(K, Ty, PoolEntryID), Value(Value) {} | 154 : Constant(K, Ty, PoolEntryID), Value(Value) {} |
| 155 ConstantPrimitive(const ConstantPrimitive &) LLVM_DELETED_FUNCTION; | 155 ConstantPrimitive(const ConstantPrimitive &) LLVM_DELETED_FUNCTION; |
| 156 ConstantPrimitive &operator=(const ConstantPrimitive &) LLVM_DELETED_FUNCTION; | 156 ConstantPrimitive &operator=(const ConstantPrimitive &) LLVM_DELETED_FUNCTION; |
| 157 virtual ~ConstantPrimitive() {} | 157 ~ConstantPrimitive() override {} |
| 158 const T Value; | 158 const T Value; |
| 159 }; | 159 }; |
| 160 | 160 |
| 161 typedef ConstantPrimitive<uint32_t, Operand::kConstInteger32> ConstantInteger32; | 161 typedef ConstantPrimitive<uint32_t, Operand::kConstInteger32> ConstantInteger32; |
| 162 typedef ConstantPrimitive<uint64_t, Operand::kConstInteger64> ConstantInteger64; | 162 typedef ConstantPrimitive<uint64_t, Operand::kConstInteger64> ConstantInteger64; |
| 163 typedef ConstantPrimitive<float, Operand::kConstFloat> ConstantFloat; | 163 typedef ConstantPrimitive<float, Operand::kConstFloat> ConstantFloat; |
| 164 typedef ConstantPrimitive<double, Operand::kConstDouble> ConstantDouble; | 164 typedef ConstantPrimitive<double, Operand::kConstDouble> ConstantDouble; |
| 165 | 165 |
| 166 template <> inline void ConstantInteger32::dump(const Cfg *, Ostream &Str) const
{ | 166 template <> inline void ConstantInteger32::dump(const Cfg *, Ostream &Str) const
{ |
| 167 if (getType() == IceType_i1) | 167 if (getType() == IceType_i1) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 uint32_t PoolEntryID) { | 206 uint32_t PoolEntryID) { |
| 207 return new (Ctx->allocate<ConstantRelocatable>()) ConstantRelocatable( | 207 return new (Ctx->allocate<ConstantRelocatable>()) ConstantRelocatable( |
| 208 Ty, Tuple.Offset, Tuple.Name, Tuple.SuppressMangling, PoolEntryID); | 208 Ty, Tuple.Offset, Tuple.Name, Tuple.SuppressMangling, PoolEntryID); |
| 209 } | 209 } |
| 210 int64_t getOffset() const { return Offset; } | 210 int64_t getOffset() const { return Offset; } |
| 211 IceString getName() const { return Name; } | 211 IceString getName() const { return Name; } |
| 212 void setSuppressMangling(bool Value) { SuppressMangling = Value; } | 212 void setSuppressMangling(bool Value) { SuppressMangling = Value; } |
| 213 bool getSuppressMangling() const { return SuppressMangling; } | 213 bool getSuppressMangling() const { return SuppressMangling; } |
| 214 using Constant::emit; | 214 using Constant::emit; |
| 215 using Constant::dump; | 215 using Constant::dump; |
| 216 virtual void emit(GlobalContext *Ctx) const; | 216 void emit(GlobalContext *Ctx) const override; |
| 217 virtual void dump(const Cfg *Func, Ostream &Str) const; | 217 void dump(const Cfg *Func, Ostream &Str) const override; |
| 218 | 218 |
| 219 static bool classof(const Operand *Operand) { | 219 static bool classof(const Operand *Operand) { |
| 220 OperandKind Kind = Operand->getKind(); | 220 OperandKind Kind = Operand->getKind(); |
| 221 return Kind == kConstRelocatable; | 221 return Kind == kConstRelocatable; |
| 222 } | 222 } |
| 223 | 223 |
| 224 private: | 224 private: |
| 225 ConstantRelocatable(Type Ty, int64_t Offset, const IceString &Name, | 225 ConstantRelocatable(Type Ty, int64_t Offset, const IceString &Name, |
| 226 bool SuppressMangling, uint32_t PoolEntryID) | 226 bool SuppressMangling, uint32_t PoolEntryID) |
| 227 : Constant(kConstRelocatable, Ty, PoolEntryID), Offset(Offset), | 227 : Constant(kConstRelocatable, Ty, PoolEntryID), Offset(Offset), |
| 228 Name(Name), SuppressMangling(SuppressMangling) {} | 228 Name(Name), SuppressMangling(SuppressMangling) {} |
| 229 ConstantRelocatable(const ConstantRelocatable &) LLVM_DELETED_FUNCTION; | 229 ConstantRelocatable(const ConstantRelocatable &) LLVM_DELETED_FUNCTION; |
| 230 ConstantRelocatable & | 230 ConstantRelocatable & |
| 231 operator=(const ConstantRelocatable &) LLVM_DELETED_FUNCTION; | 231 operator=(const ConstantRelocatable &) LLVM_DELETED_FUNCTION; |
| 232 virtual ~ConstantRelocatable() {} | 232 ~ConstantRelocatable() override {} |
| 233 const int64_t Offset; // fixed offset to add | 233 const int64_t Offset; // fixed offset to add |
| 234 const IceString Name; // optional for debug/dump | 234 const IceString Name; // optional for debug/dump |
| 235 bool SuppressMangling; | 235 bool SuppressMangling; |
| 236 }; | 236 }; |
| 237 | 237 |
| 238 // ConstantUndef represents an unspecified bit pattern. Although it is | 238 // ConstantUndef represents an unspecified bit pattern. Although it is |
| 239 // legal to lower ConstantUndef to any value, backends should try to | 239 // legal to lower ConstantUndef to any value, backends should try to |
| 240 // make code generation deterministic by lowering ConstantUndefs to 0. | 240 // make code generation deterministic by lowering ConstantUndefs to 0. |
| 241 class ConstantUndef : public Constant { | 241 class ConstantUndef : public Constant { |
| 242 public: | 242 public: |
| 243 static ConstantUndef *create(GlobalContext *Ctx, Type Ty, | 243 static ConstantUndef *create(GlobalContext *Ctx, Type Ty, |
| 244 uint32_t PoolEntryID) { | 244 uint32_t PoolEntryID) { |
| 245 return new (Ctx->allocate<ConstantUndef>()) ConstantUndef(Ty, PoolEntryID); | 245 return new (Ctx->allocate<ConstantUndef>()) ConstantUndef(Ty, PoolEntryID); |
| 246 } | 246 } |
| 247 | 247 |
| 248 using Constant::emit; | 248 using Constant::emit; |
| 249 using Constant::dump; | 249 using Constant::dump; |
| 250 // The target needs to implement this. | 250 // The target needs to implement this. |
| 251 virtual void emit(GlobalContext *Ctx) const; | 251 void emit(GlobalContext *Ctx) const override; |
| 252 virtual void dump(const Cfg *, Ostream &Str) const { Str << "undef"; } | 252 void dump(const Cfg *, Ostream &Str) const override { Str << "undef"; } |
| 253 | 253 |
| 254 static bool classof(const Operand *Operand) { | 254 static bool classof(const Operand *Operand) { |
| 255 return Operand->getKind() == kConstUndef; | 255 return Operand->getKind() == kConstUndef; |
| 256 } | 256 } |
| 257 | 257 |
| 258 private: | 258 private: |
| 259 ConstantUndef(Type Ty, uint32_t PoolEntryID) | 259 ConstantUndef(Type Ty, uint32_t PoolEntryID) |
| 260 : Constant(kConstUndef, Ty, PoolEntryID) {} | 260 : Constant(kConstUndef, Ty, PoolEntryID) {} |
| 261 ConstantUndef(const ConstantUndef &) LLVM_DELETED_FUNCTION; | 261 ConstantUndef(const ConstantUndef &) LLVM_DELETED_FUNCTION; |
| 262 ConstantUndef &operator=(const ConstantUndef &) LLVM_DELETED_FUNCTION; | 262 ConstantUndef &operator=(const ConstantUndef &) LLVM_DELETED_FUNCTION; |
| 263 virtual ~ConstantUndef() {} | 263 ~ConstantUndef() override {} |
| 264 }; | 264 }; |
| 265 | 265 |
| 266 // RegWeight is a wrapper for a uint32_t weight value, with a | 266 // RegWeight is a wrapper for a uint32_t weight value, with a |
| 267 // special value that represents infinite weight, and an addWeight() | 267 // special value that represents infinite weight, and an addWeight() |
| 268 // method that ensures that W+infinity=infinity. | 268 // method that ensures that W+infinity=infinity. |
| 269 class RegWeight { | 269 class RegWeight { |
| 270 public: | 270 public: |
| 271 RegWeight() : Weight(0) {} | 271 RegWeight() : Weight(0) {} |
| 272 RegWeight(uint32_t Weight) : Weight(Weight) {} | 272 RegWeight(uint32_t Weight) : Weight(Weight) {} |
| 273 const static uint32_t Inf = ~0; // Force regalloc to give a register | 273 const static uint32_t Inf = ~0; // Force regalloc to give a register |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 LoVar = Lo; | 408 LoVar = Lo; |
| 409 HiVar = Hi; | 409 HiVar = Hi; |
| 410 } | 410 } |
| 411 // Creates a temporary copy of the variable with a different type. | 411 // Creates a temporary copy of the variable with a different type. |
| 412 // Used primarily for syntactic correctness of textual assembly | 412 // Used primarily for syntactic correctness of textual assembly |
| 413 // emission. Note that only basic information is copied, in | 413 // emission. Note that only basic information is copied, in |
| 414 // particular not DefInst, IsArgument, Weight, LoVar, HiVar, | 414 // particular not DefInst, IsArgument, Weight, LoVar, HiVar, |
| 415 // VarsReal. | 415 // VarsReal. |
| 416 Variable asType(Type Ty); | 416 Variable asType(Type Ty); |
| 417 | 417 |
| 418 virtual void emit(const Cfg *Func) const; | 418 void emit(const Cfg *Func) const override; |
| 419 using Operand::dump; | 419 using Operand::dump; |
| 420 virtual void dump(const Cfg *Func, Ostream &Str) const; | 420 void dump(const Cfg *Func, Ostream &Str) const override; |
| 421 | 421 |
| 422 static bool classof(const Operand *Operand) { | 422 static bool classof(const Operand *Operand) { |
| 423 OperandKind Kind = Operand->getKind(); | 423 OperandKind Kind = Operand->getKind(); |
| 424 return Kind >= kVariable && Kind <= kVariable_Num; | 424 return Kind >= kVariable && Kind <= kVariable_Num; |
| 425 } | 425 } |
| 426 | 426 |
| 427 // The destructor is public because of the asType() method. | 427 // The destructor is public because of the asType() method. |
| 428 virtual ~Variable() {} | 428 ~Variable() override {} |
| 429 | 429 |
| 430 protected: | 430 protected: |
| 431 Variable(OperandKind K, Type Ty, SizeT Index, const IceString &Name) | 431 Variable(OperandKind K, Type Ty, SizeT Index, const IceString &Name) |
| 432 : Operand(K, Ty), Number(Index), Name(Name), IsArgument(false), | 432 : Operand(K, Ty), Number(Index), Name(Name), IsArgument(false), |
| 433 IsImplicitArgument(false), StackOffset(0), RegNum(NoRegister), | 433 IsImplicitArgument(false), StackOffset(0), RegNum(NoRegister), |
| 434 RegNumTmp(NoRegister), Weight(1), LoVar(NULL), HiVar(NULL) { | 434 RegNumTmp(NoRegister), Weight(1), LoVar(NULL), HiVar(NULL) { |
| 435 Vars = VarsReal; | 435 Vars = VarsReal; |
| 436 Vars[0] = this; | 436 Vars[0] = this; |
| 437 NumVars = 1; | 437 NumVars = 1; |
| 438 } | 438 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 const Cfg *Func; | 560 const Cfg *Func; |
| 561 std::vector<VariableTracking> Metadata; | 561 std::vector<VariableTracking> Metadata; |
| 562 const static InstDefList NoDefinitions; | 562 const static InstDefList NoDefinitions; |
| 563 VariablesMetadata(const VariablesMetadata &) LLVM_DELETED_FUNCTION; | 563 VariablesMetadata(const VariablesMetadata &) LLVM_DELETED_FUNCTION; |
| 564 VariablesMetadata &operator=(const VariablesMetadata &) LLVM_DELETED_FUNCTION; | 564 VariablesMetadata &operator=(const VariablesMetadata &) LLVM_DELETED_FUNCTION; |
| 565 }; | 565 }; |
| 566 | 566 |
| 567 } // end of namespace Ice | 567 } // end of namespace Ice |
| 568 | 568 |
| 569 #endif // SUBZERO_SRC_ICEOPERAND_H | 569 #endif // SUBZERO_SRC_ICEOPERAND_H |
| OLD | NEW |