| OLD | NEW |
| 1 //===- subzero/src/IceTargetLowering.h - Lowering interface -----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLowering.h - Lowering interface -----*- 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 TargetLowering, LoweringContext, and | 10 // This file declares the TargetLowering, LoweringContext, and |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // instructions in a node, and insert new (lowered) instructions at | 32 // instructions in a node, and insert new (lowered) instructions at |
| 33 // the current point. Along with the instruction list container and | 33 // the current point. Along with the instruction list container and |
| 34 // associated iterators, it holds the current node, which is needed | 34 // associated iterators, it holds the current node, which is needed |
| 35 // when inserting new instructions in order to track whether variables | 35 // when inserting new instructions in order to track whether variables |
| 36 // are used as single-block or multi-block. | 36 // are used as single-block or multi-block. |
| 37 class LoweringContext { | 37 class LoweringContext { |
| 38 LoweringContext(const LoweringContext &) = delete; | 38 LoweringContext(const LoweringContext &) = delete; |
| 39 LoweringContext &operator=(const LoweringContext &) = delete; | 39 LoweringContext &operator=(const LoweringContext &) = delete; |
| 40 | 40 |
| 41 public: | 41 public: |
| 42 LoweringContext() : Node(nullptr), LastInserted(nullptr) {} | 42 LoweringContext() = default; |
| 43 ~LoweringContext() {} | 43 ~LoweringContext() = default; |
| 44 void init(CfgNode *Node); | 44 void init(CfgNode *Node); |
| 45 Inst *getNextInst() const { | 45 Inst *getNextInst() const { |
| 46 if (Next == End) | 46 if (Next == End) |
| 47 return nullptr; | 47 return nullptr; |
| 48 return Next; | 48 return Next; |
| 49 } | 49 } |
| 50 Inst *getNextInst(InstList::iterator &Iter) const { | 50 Inst *getNextInst(InstList::iterator &Iter) const { |
| 51 advanceForward(Iter); | 51 advanceForward(Iter); |
| 52 if (Iter == End) | 52 if (Iter == End) |
| 53 return nullptr; | 53 return nullptr; |
| 54 return Iter; | 54 return Iter; |
| 55 } | 55 } |
| 56 CfgNode *getNode() const { return Node; } | 56 CfgNode *getNode() const { return Node; } |
| 57 bool atEnd() const { return Cur == End; } | 57 bool atEnd() const { return Cur == End; } |
| 58 InstList::iterator getCur() const { return Cur; } | 58 InstList::iterator getCur() const { return Cur; } |
| 59 InstList::iterator getNext() const { return Next; } | 59 InstList::iterator getNext() const { return Next; } |
| 60 InstList::iterator getEnd() const { return End; } | 60 InstList::iterator getEnd() const { return End; } |
| 61 void insert(Inst *Inst); | 61 void insert(Inst *Inst); |
| 62 Inst *getLastInserted() const; | 62 Inst *getLastInserted() const; |
| 63 void advanceCur() { Cur = Next; } | 63 void advanceCur() { Cur = Next; } |
| 64 void advanceNext() { advanceForward(Next); } | 64 void advanceNext() { advanceForward(Next); } |
| 65 void rewind(); | 65 void rewind(); |
| 66 void setInsertPoint(const InstList::iterator &Position) { Next = Position; } | 66 void setInsertPoint(const InstList::iterator &Position) { Next = Position; } |
| 67 | 67 |
| 68 private: | 68 private: |
| 69 // Node is the argument to Inst::updateVars(). | 69 // Node is the argument to Inst::updateVars(). |
| 70 CfgNode *Node; | 70 CfgNode *Node = nullptr; |
| 71 Inst *LastInserted; | 71 Inst *LastInserted = nullptr; |
| 72 // Cur points to the current instruction being considered. It is | 72 // Cur points to the current instruction being considered. It is |
| 73 // guaranteed to point to a non-deleted instruction, or to be End. | 73 // guaranteed to point to a non-deleted instruction, or to be End. |
| 74 InstList::iterator Cur; | 74 InstList::iterator Cur; |
| 75 // Next doubles as a pointer to the next valid instruction (if any), | 75 // Next doubles as a pointer to the next valid instruction (if any), |
| 76 // and the new-instruction insertion point. It is also updated for | 76 // and the new-instruction insertion point. It is also updated for |
| 77 // the caller in case the lowering consumes more than one high-level | 77 // the caller in case the lowering consumes more than one high-level |
| 78 // instruction. It is guaranteed to point to a non-deleted | 78 // instruction. It is guaranteed to point to a non-deleted |
| 79 // instruction after Cur, or to be End. TODO: Consider separating | 79 // instruction after Cur, or to be End. TODO: Consider separating |
| 80 // the notion of "next valid instruction" and "new instruction | 80 // the notion of "next valid instruction" and "new instruction |
| 81 // insertion point", to avoid confusion when previously-deleted | 81 // insertion point", to avoid confusion when previously-deleted |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 virtual void emit(const ConstantFloat *C) const = 0; | 219 virtual void emit(const ConstantFloat *C) const = 0; |
| 220 virtual void emit(const ConstantDouble *C) const = 0; | 220 virtual void emit(const ConstantDouble *C) const = 0; |
| 221 | 221 |
| 222 // Performs target-specific argument lowering. | 222 // Performs target-specific argument lowering. |
| 223 virtual void lowerArguments() = 0; | 223 virtual void lowerArguments() = 0; |
| 224 | 224 |
| 225 virtual void initNodeForLowering(CfgNode *) {} | 225 virtual void initNodeForLowering(CfgNode *) {} |
| 226 virtual void addProlog(CfgNode *Node) = 0; | 226 virtual void addProlog(CfgNode *Node) = 0; |
| 227 virtual void addEpilog(CfgNode *Node) = 0; | 227 virtual void addEpilog(CfgNode *Node) = 0; |
| 228 | 228 |
| 229 virtual ~TargetLowering() {} | 229 virtual ~TargetLowering() = default; |
| 230 | 230 |
| 231 protected: | 231 protected: |
| 232 explicit TargetLowering(Cfg *Func); | 232 explicit TargetLowering(Cfg *Func); |
| 233 virtual void lowerAlloca(const InstAlloca *Inst) = 0; | 233 virtual void lowerAlloca(const InstAlloca *Inst) = 0; |
| 234 virtual void lowerArithmetic(const InstArithmetic *Inst) = 0; | 234 virtual void lowerArithmetic(const InstArithmetic *Inst) = 0; |
| 235 virtual void lowerAssign(const InstAssign *Inst) = 0; | 235 virtual void lowerAssign(const InstAssign *Inst) = 0; |
| 236 virtual void lowerBr(const InstBr *Inst) = 0; | 236 virtual void lowerBr(const InstBr *Inst) = 0; |
| 237 virtual void lowerCall(const InstCall *Inst) = 0; | 237 virtual void lowerCall(const InstCall *Inst) = 0; |
| 238 virtual void lowerCast(const InstCast *Inst) = 0; | 238 virtual void lowerCast(const InstCast *Inst) = 0; |
| 239 virtual void lowerFcmp(const InstFcmp *Inst) = 0; | 239 virtual void lowerFcmp(const InstFcmp *Inst) = 0; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 SizeT MaxSrcs); | 316 SizeT MaxSrcs); |
| 317 | 317 |
| 318 void | 318 void |
| 319 _bundle_lock(InstBundleLock::Option BundleOption = InstBundleLock::Opt_None) { | 319 _bundle_lock(InstBundleLock::Option BundleOption = InstBundleLock::Opt_None) { |
| 320 Context.insert(InstBundleLock::create(Func, BundleOption)); | 320 Context.insert(InstBundleLock::create(Func, BundleOption)); |
| 321 } | 321 } |
| 322 void _bundle_unlock() { Context.insert(InstBundleUnlock::create(Func)); } | 322 void _bundle_unlock() { Context.insert(InstBundleUnlock::create(Func)); } |
| 323 | 323 |
| 324 Cfg *Func; | 324 Cfg *Func; |
| 325 GlobalContext *Ctx; | 325 GlobalContext *Ctx; |
| 326 bool HasComputedFrame; | 326 bool HasComputedFrame = false; |
| 327 bool CallsReturnsTwice; | 327 bool CallsReturnsTwice = false; |
| 328 // StackAdjustment keeps track of the current stack offset from its | 328 // StackAdjustment keeps track of the current stack offset from its |
| 329 // natural location, as arguments are pushed for a function call. | 329 // natural location, as arguments are pushed for a function call. |
| 330 int32_t StackAdjustment; | 330 int32_t StackAdjustment = 0; |
| 331 SizeT NextLabelNumber; | 331 SizeT NextLabelNumber = 0; |
| 332 LoweringContext Context; | 332 LoweringContext Context; |
| 333 | 333 |
| 334 // Runtime helper function names | 334 // Runtime helper function names |
| 335 const static constexpr char *H_bitcast_16xi1_i16 = "__Sz_bitcast_16xi1_i16"; | 335 const static constexpr char *H_bitcast_16xi1_i16 = "__Sz_bitcast_16xi1_i16"; |
| 336 const static constexpr char *H_bitcast_8xi1_i8 = "__Sz_bitcast_8xi1_i8"; | 336 const static constexpr char *H_bitcast_8xi1_i8 = "__Sz_bitcast_8xi1_i8"; |
| 337 const static constexpr char *H_bitcast_i16_16xi1 = "__Sz_bitcast_i16_16xi1"; | 337 const static constexpr char *H_bitcast_i16_16xi1 = "__Sz_bitcast_i16_16xi1"; |
| 338 const static constexpr char *H_bitcast_i8_8xi1 = "__Sz_bitcast_i8_8xi1"; | 338 const static constexpr char *H_bitcast_i8_8xi1 = "__Sz_bitcast_i8_8xi1"; |
| 339 const static constexpr char *H_call_ctpop_i32 = "__popcountsi2"; | 339 const static constexpr char *H_call_ctpop_i32 = "__popcountsi2"; |
| 340 const static constexpr char *H_call_ctpop_i64 = "__popcountdi2"; | 340 const static constexpr char *H_call_ctpop_i64 = "__popcountdi2"; |
| 341 const static constexpr char *H_call_longjmp = "longjmp"; | 341 const static constexpr char *H_call_longjmp = "longjmp"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 359 const static constexpr char *H_srem_i64 = "__moddi3"; | 359 const static constexpr char *H_srem_i64 = "__moddi3"; |
| 360 const static constexpr char *H_udiv_i64 = "__udivdi3"; | 360 const static constexpr char *H_udiv_i64 = "__udivdi3"; |
| 361 const static constexpr char *H_uitofp_4xi32_4xf32 = "__Sz_uitofp_4xi32_4xf32"; | 361 const static constexpr char *H_uitofp_4xi32_4xf32 = "__Sz_uitofp_4xi32_4xf32"; |
| 362 const static constexpr char *H_uitofp_i32_f32 = "__Sz_uitofp_i32_f32"; | 362 const static constexpr char *H_uitofp_i32_f32 = "__Sz_uitofp_i32_f32"; |
| 363 const static constexpr char *H_uitofp_i32_f64 = "__Sz_uitofp_i32_f64"; | 363 const static constexpr char *H_uitofp_i32_f64 = "__Sz_uitofp_i32_f64"; |
| 364 const static constexpr char *H_uitofp_i64_f32 = "__Sz_uitofp_i64_f32"; | 364 const static constexpr char *H_uitofp_i64_f32 = "__Sz_uitofp_i64_f32"; |
| 365 const static constexpr char *H_uitofp_i64_f64 = "__Sz_uitofp_i64_f64"; | 365 const static constexpr char *H_uitofp_i64_f64 = "__Sz_uitofp_i64_f64"; |
| 366 const static constexpr char *H_urem_i64 = "__umoddi3"; | 366 const static constexpr char *H_urem_i64 = "__umoddi3"; |
| 367 | 367 |
| 368 private: | 368 private: |
| 369 int32_t SnapshotStackAdjustment; | 369 int32_t SnapshotStackAdjustment = 0; |
| 370 }; | 370 }; |
| 371 | 371 |
| 372 // TargetDataLowering is used for "lowering" data including initializers | 372 // TargetDataLowering is used for "lowering" data including initializers |
| 373 // for global variables, and the internal constant pools. It is separated | 373 // for global variables, and the internal constant pools. It is separated |
| 374 // out from TargetLowering because it does not require a Cfg. | 374 // out from TargetLowering because it does not require a Cfg. |
| 375 class TargetDataLowering { | 375 class TargetDataLowering { |
| 376 TargetDataLowering() = delete; | 376 TargetDataLowering() = delete; |
| 377 TargetDataLowering(const TargetDataLowering &) = delete; | 377 TargetDataLowering(const TargetDataLowering &) = delete; |
| 378 TargetDataLowering &operator=(const TargetDataLowering &) = delete; | 378 TargetDataLowering &operator=(const TargetDataLowering &) = delete; |
| 379 | 379 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 virtual void lower() {} | 414 virtual void lower() {} |
| 415 | 415 |
| 416 protected: | 416 protected: |
| 417 explicit TargetHeaderLowering(GlobalContext *Ctx) : Ctx(Ctx) {} | 417 explicit TargetHeaderLowering(GlobalContext *Ctx) : Ctx(Ctx) {} |
| 418 GlobalContext *Ctx; | 418 GlobalContext *Ctx; |
| 419 }; | 419 }; |
| 420 | 420 |
| 421 } // end of namespace Ice | 421 } // end of namespace Ice |
| 422 | 422 |
| 423 #endif // SUBZERO_SRC_ICETARGETLOWERING_H | 423 #endif // SUBZERO_SRC_ICETARGETLOWERING_H |
| OLD | NEW |