| OLD | NEW |
| 1 //===- subzero/src/IceInstX8632.h - Low-level x86 instructions --*- C++ -*-===// | 1 //===- subzero/src/IceInstX8632.h - Low-level x86 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 // This file declares the InstX8632 and OperandX8632 classes and | 10 // This file declares the InstX8632 and OperandX8632 classes and |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 public: | 61 public: |
| 62 enum SegmentRegisters { | 62 enum SegmentRegisters { |
| 63 DefaultSegment = -1, | 63 DefaultSegment = -1, |
| 64 #define X(val, name, prefix) val, | 64 #define X(val, name, prefix) val, |
| 65 SEG_REGX8632_TABLE | 65 SEG_REGX8632_TABLE |
| 66 #undef X | 66 #undef X |
| 67 SegReg_NUM | 67 SegReg_NUM |
| 68 }; | 68 }; |
| 69 static OperandX8632Mem *create(Cfg *Func, Type Ty, Variable *Base, | 69 static OperandX8632Mem *create(Cfg *Func, Type Ty, Variable *Base, |
| 70 Constant *Offset, Variable *Index = NULL, | 70 Constant *Offset, Variable *Index = nullptr, |
| 71 uint16_t Shift = 0, | 71 uint16_t Shift = 0, |
| 72 SegmentRegisters SegmentReg = DefaultSegment) { | 72 SegmentRegisters SegmentReg = DefaultSegment) { |
| 73 return new (Func->allocate<OperandX8632Mem>()) | 73 return new (Func->allocate<OperandX8632Mem>()) |
| 74 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); | 74 OperandX8632Mem(Func, Ty, Base, Offset, Index, Shift, SegmentReg); |
| 75 } | 75 } |
| 76 Variable *getBase() const { return Base; } | 76 Variable *getBase() const { return Base; } |
| 77 Constant *getOffset() const { return Offset; } | 77 Constant *getOffset() const { return Offset; } |
| 78 Variable *getIndex() const { return Index; } | 78 Variable *getIndex() const { return Index; } |
| 79 uint16_t getShift() const { return Shift; } | 79 uint16_t getShift() const { return Shift; } |
| 80 SegmentRegisters getSegmentRegister() const { return SegmentReg; } | 80 SegmentRegisters getSegmentRegister() const { return SegmentReg; } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 const static OperandKind SpillVariableKind = | 158 const static OperandKind SpillVariableKind = |
| 159 static_cast<OperandKind>(kVariable_Target); | 159 static_cast<OperandKind>(kVariable_Target); |
| 160 static bool classof(const Operand *Operand) { | 160 static bool classof(const Operand *Operand) { |
| 161 return Operand->getKind() == SpillVariableKind; | 161 return Operand->getKind() == SpillVariableKind; |
| 162 } | 162 } |
| 163 void setLinkedTo(Variable *Var) { LinkedTo = Var; } | 163 void setLinkedTo(Variable *Var) { LinkedTo = Var; } |
| 164 Variable *getLinkedTo() const { return LinkedTo; } | 164 Variable *getLinkedTo() const { return LinkedTo; } |
| 165 // Inherit dump() and emit() from Variable. | 165 // Inherit dump() and emit() from Variable. |
| 166 private: | 166 private: |
| 167 SpillVariable(Type Ty, SizeT Index) | 167 SpillVariable(Type Ty, SizeT Index) |
| 168 : Variable(SpillVariableKind, Ty, Index), LinkedTo(NULL) {} | 168 : Variable(SpillVariableKind, Ty, Index), LinkedTo(nullptr) {} |
| 169 Variable *LinkedTo; | 169 Variable *LinkedTo; |
| 170 }; | 170 }; |
| 171 | 171 |
| 172 class InstX8632 : public InstTarget { | 172 class InstX8632 : public InstTarget { |
| 173 InstX8632(const InstX8632 &) = delete; | 173 InstX8632(const InstX8632 &) = delete; |
| 174 InstX8632 &operator=(const InstX8632 &) = delete; | 174 InstX8632 &operator=(const InstX8632 &) = delete; |
| 175 | 175 |
| 176 public: | 176 public: |
| 177 enum InstKindX8632 { | 177 enum InstKindX8632 { |
| 178 k__Start = Inst::Target, | 178 k__Start = Inst::Target, |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 // Conditional and unconditional branch instruction. | 337 // Conditional and unconditional branch instruction. |
| 338 class InstX8632Br : public InstX8632 { | 338 class InstX8632Br : public InstX8632 { |
| 339 InstX8632Br(const InstX8632Br &) = delete; | 339 InstX8632Br(const InstX8632Br &) = delete; |
| 340 InstX8632Br &operator=(const InstX8632Br &) = delete; | 340 InstX8632Br &operator=(const InstX8632Br &) = delete; |
| 341 | 341 |
| 342 public: | 342 public: |
| 343 // Create a conditional branch to a node. | 343 // Create a conditional branch to a node. |
| 344 static InstX8632Br *create(Cfg *Func, CfgNode *TargetTrue, | 344 static InstX8632Br *create(Cfg *Func, CfgNode *TargetTrue, |
| 345 CfgNode *TargetFalse, CondX86::BrCond Condition) { | 345 CfgNode *TargetFalse, CondX86::BrCond Condition) { |
| 346 assert(Condition != CondX86::Br_None); | 346 assert(Condition != CondX86::Br_None); |
| 347 const InstX8632Label *NoLabel = NULL; | 347 const InstX8632Label *NoLabel = nullptr; |
| 348 return new (Func->allocate<InstX8632Br>()) | 348 return new (Func->allocate<InstX8632Br>()) |
| 349 InstX8632Br(Func, TargetTrue, TargetFalse, NoLabel, Condition); | 349 InstX8632Br(Func, TargetTrue, TargetFalse, NoLabel, Condition); |
| 350 } | 350 } |
| 351 // Create an unconditional branch to a node. | 351 // Create an unconditional branch to a node. |
| 352 static InstX8632Br *create(Cfg *Func, CfgNode *Target) { | 352 static InstX8632Br *create(Cfg *Func, CfgNode *Target) { |
| 353 const CfgNode *NoCondTarget = NULL; | 353 const CfgNode *NoCondTarget = nullptr; |
| 354 const InstX8632Label *NoLabel = NULL; | 354 const InstX8632Label *NoLabel = nullptr; |
| 355 return new (Func->allocate<InstX8632Br>()) | 355 return new (Func->allocate<InstX8632Br>()) |
| 356 InstX8632Br(Func, NoCondTarget, Target, NoLabel, CondX86::Br_None); | 356 InstX8632Br(Func, NoCondTarget, Target, NoLabel, CondX86::Br_None); |
| 357 } | 357 } |
| 358 // Create a non-terminator conditional branch to a node, with a | 358 // Create a non-terminator conditional branch to a node, with a |
| 359 // fallthrough to the next instruction in the current node. This is | 359 // fallthrough to the next instruction in the current node. This is |
| 360 // used for switch lowering. | 360 // used for switch lowering. |
| 361 static InstX8632Br *create(Cfg *Func, CfgNode *Target, | 361 static InstX8632Br *create(Cfg *Func, CfgNode *Target, |
| 362 CondX86::BrCond Condition) { | 362 CondX86::BrCond Condition) { |
| 363 assert(Condition != CondX86::Br_None); | 363 assert(Condition != CondX86::Br_None); |
| 364 const CfgNode *NoUncondTarget = NULL; | 364 const CfgNode *NoUncondTarget = nullptr; |
| 365 const InstX8632Label *NoLabel = NULL; | 365 const InstX8632Label *NoLabel = nullptr; |
| 366 return new (Func->allocate<InstX8632Br>()) | 366 return new (Func->allocate<InstX8632Br>()) |
| 367 InstX8632Br(Func, Target, NoUncondTarget, NoLabel, Condition); | 367 InstX8632Br(Func, Target, NoUncondTarget, NoLabel, Condition); |
| 368 } | 368 } |
| 369 // Create a conditional intra-block branch (or unconditional, if | 369 // Create a conditional intra-block branch (or unconditional, if |
| 370 // Condition==Br_None) to a label in the current block. | 370 // Condition==Br_None) to a label in the current block. |
| 371 static InstX8632Br *create(Cfg *Func, InstX8632Label *Label, | 371 static InstX8632Br *create(Cfg *Func, InstX8632Label *Label, |
| 372 CondX86::BrCond Condition) { | 372 CondX86::BrCond Condition) { |
| 373 const CfgNode *NoCondTarget = NULL; | 373 const CfgNode *NoCondTarget = nullptr; |
| 374 const CfgNode *NoUncondTarget = NULL; | 374 const CfgNode *NoUncondTarget = nullptr; |
| 375 return new (Func->allocate<InstX8632Br>()) | 375 return new (Func->allocate<InstX8632Br>()) |
| 376 InstX8632Br(Func, NoCondTarget, NoUncondTarget, Label, Condition); | 376 InstX8632Br(Func, NoCondTarget, NoUncondTarget, Label, Condition); |
| 377 } | 377 } |
| 378 const CfgNode *getTargetTrue() const { return TargetTrue; } | 378 const CfgNode *getTargetTrue() const { return TargetTrue; } |
| 379 const CfgNode *getTargetFalse() const { return TargetFalse; } | 379 const CfgNode *getTargetFalse() const { return TargetFalse; } |
| 380 bool optimizeBranch(const CfgNode *NextNode); | 380 bool optimizeBranch(const CfgNode *NextNode); |
| 381 uint32_t getEmitInstCount() const override { | 381 uint32_t getEmitInstCount() const override { |
| 382 uint32_t Sum = 0; | 382 uint32_t Sum = 0; |
| 383 if (Label) | 383 if (Label) |
| 384 ++Sum; | 384 ++Sum; |
| (...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1479 | 1479 |
| 1480 // Ret instruction. Currently only supports the "ret" version that | 1480 // Ret instruction. Currently only supports the "ret" version that |
| 1481 // does not pop arguments. This instruction takes a Source operand | 1481 // does not pop arguments. This instruction takes a Source operand |
| 1482 // (for non-void returning functions) for liveness analysis, though | 1482 // (for non-void returning functions) for liveness analysis, though |
| 1483 // a FakeUse before the ret would do just as well. | 1483 // a FakeUse before the ret would do just as well. |
| 1484 class InstX8632Ret : public InstX8632 { | 1484 class InstX8632Ret : public InstX8632 { |
| 1485 InstX8632Ret(const InstX8632Ret &) = delete; | 1485 InstX8632Ret(const InstX8632Ret &) = delete; |
| 1486 InstX8632Ret &operator=(const InstX8632Ret &) = delete; | 1486 InstX8632Ret &operator=(const InstX8632Ret &) = delete; |
| 1487 | 1487 |
| 1488 public: | 1488 public: |
| 1489 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) { | 1489 static InstX8632Ret *create(Cfg *Func, Variable *Source = nullptr) { |
| 1490 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); | 1490 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); |
| 1491 } | 1491 } |
| 1492 void emit(const Cfg *Func) const override; | 1492 void emit(const Cfg *Func) const override; |
| 1493 void emitIAS(const Cfg *Func) const override; | 1493 void emitIAS(const Cfg *Func) const override; |
| 1494 void dump(const Cfg *Func) const override; | 1494 void dump(const Cfg *Func) const override; |
| 1495 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } | 1495 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } |
| 1496 | 1496 |
| 1497 private: | 1497 private: |
| 1498 InstX8632Ret(Cfg *Func, Variable *Source); | 1498 InstX8632Ret(Cfg *Func, Variable *Source); |
| 1499 ~InstX8632Ret() override {} | 1499 ~InstX8632Ret() override {} |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1590 template <> void InstX8632Pinsr::emitIAS(const Cfg *Func) const; | 1590 template <> void InstX8632Pinsr::emitIAS(const Cfg *Func) const; |
| 1591 template <> void InstX8632Movsx::emitIAS(const Cfg *Func) const; | 1591 template <> void InstX8632Movsx::emitIAS(const Cfg *Func) const; |
| 1592 template <> void InstX8632Movzx::emitIAS(const Cfg *Func) const; | 1592 template <> void InstX8632Movzx::emitIAS(const Cfg *Func) const; |
| 1593 template <> void InstX8632Pmull::emitIAS(const Cfg *Func) const; | 1593 template <> void InstX8632Pmull::emitIAS(const Cfg *Func) const; |
| 1594 template <> void InstX8632Pshufd::emitIAS(const Cfg *Func) const; | 1594 template <> void InstX8632Pshufd::emitIAS(const Cfg *Func) const; |
| 1595 template <> void InstX8632Shufps::emitIAS(const Cfg *Func) const; | 1595 template <> void InstX8632Shufps::emitIAS(const Cfg *Func) const; |
| 1596 | 1596 |
| 1597 } // end of namespace Ice | 1597 } // end of namespace Ice |
| 1598 | 1598 |
| 1599 #endif // SUBZERO_SRC_ICEINSTX8632_H | 1599 #endif // SUBZERO_SRC_ICEINSTX8632_H |
| OLD | NEW |