OLD | NEW |
1 //===- subzero/src/IceInstX86Base.h - Generic x86 instructions -*- C++ -*--===// | 1 //===- subzero/src/IceInstX86Base.h - Generic 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 /// \file | 10 /// \file |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 Cmpps, | 94 Cmpps, |
95 Cmpxchg, | 95 Cmpxchg, |
96 Cmpxchg8b, | 96 Cmpxchg8b, |
97 Cvt, | 97 Cvt, |
98 Div, | 98 Div, |
99 Divps, | 99 Divps, |
100 Divss, | 100 Divss, |
101 FakeRMW, | 101 FakeRMW, |
102 Fld, | 102 Fld, |
103 Fstp, | 103 Fstp, |
| 104 GetIP, |
104 Icmp, | 105 Icmp, |
105 Idiv, | 106 Idiv, |
106 Imul, | 107 Imul, |
107 ImulImm, | 108 ImulImm, |
108 Insertps, | 109 Insertps, |
109 Jmp, | 110 Jmp, |
110 Label, | 111 Label, |
111 Lea, | 112 Lea, |
112 Load, | 113 Load, |
113 Mfence, | 114 Mfence, |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 static bool classof(const Inst *Inst) { | 259 static bool classof(const Inst *Inst) { |
259 return InstX86Base::isClassof(Inst, InstX86Base::FakeRMW); | 260 return InstX86Base::isClassof(Inst, InstX86Base::FakeRMW); |
260 } | 261 } |
261 | 262 |
262 private: | 263 private: |
263 InstArithmetic::OpKind Op; | 264 InstArithmetic::OpKind Op; |
264 InstX86FakeRMW(Cfg *Func, Operand *Data, Operand *Addr, | 265 InstX86FakeRMW(Cfg *Func, Operand *Data, Operand *Addr, |
265 InstArithmetic::OpKind Op, Variable *Beacon); | 266 InstArithmetic::OpKind Op, Variable *Beacon); |
266 }; | 267 }; |
267 | 268 |
| 269 class InstX86GetIP final : public InstX86Base { |
| 270 InstX86GetIP() = delete; |
| 271 InstX86GetIP(const InstX86GetIP &) = delete; |
| 272 InstX86GetIP &operator=(const InstX86GetIP &) = delete; |
| 273 |
| 274 public: |
| 275 static InstX86GetIP *create(Cfg *Func, Variable *Dest) { |
| 276 return new (Func->allocate<InstX86GetIP>()) InstX86GetIP(Func, Dest); |
| 277 } |
| 278 void emit(const Cfg *Func) const override; |
| 279 void emitIAS(const Cfg *Func) const override; |
| 280 void dump(const Cfg *Func) const override; |
| 281 static bool classof(const Inst *Inst) { |
| 282 return InstX86Base::isClassof(Inst, InstX86Base::GetIP); |
| 283 } |
| 284 |
| 285 private: |
| 286 InstX86GetIP(Cfg *Func, Variable *Dest); |
| 287 }; |
| 288 |
268 /// InstX86Label represents an intra-block label that is the target of an | 289 /// InstX86Label represents an intra-block label that is the target of an |
269 /// intra-block branch. The offset between the label and the branch must be | 290 /// intra-block branch. The offset between the label and the branch must be |
270 /// fit into one byte (considered "near"). These are used for lowering i1 | 291 /// fit into one byte (considered "near"). These are used for lowering i1 |
271 /// calculations, Select instructions, and 64-bit compares on a 32-bit | 292 /// calculations, Select instructions, and 64-bit compares on a 32-bit |
272 /// architecture, without basic block splitting. Basic block splitting is not | 293 /// architecture, without basic block splitting. Basic block splitting is not |
273 /// so desirable for several reasons, one of which is the impact on decisions | 294 /// so desirable for several reasons, one of which is the impact on decisions |
274 /// based on whether a variable's live range spans multiple basic blocks. | 295 /// based on whether a variable's live range spans multiple basic blocks. |
275 /// | 296 /// |
276 /// Intra-block control flow must be used with caution. Consider the sequence | 297 /// Intra-block control flow must be used with caution. Consider the sequence |
277 /// for "c = (a >= b ? x : y)". | 298 /// for "c = (a >= b ? x : y)". |
(...skipping 2486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2764 private: | 2785 private: |
2765 InstX86IacaEnd(Cfg *Func); | 2786 InstX86IacaEnd(Cfg *Func); |
2766 }; | 2787 }; |
2767 }; // struct InstImpl | 2788 }; // struct InstImpl |
2768 | 2789 |
2769 /// struct Insts is a template that can be used to instantiate all the X86 | 2790 /// struct Insts is a template that can be used to instantiate all the X86 |
2770 /// instructions for a target with a simple | 2791 /// instructions for a target with a simple |
2771 /// | 2792 /// |
2772 /// using Insts = ::Ice::X86NAMESPACE::Insts<TraitsType>; | 2793 /// using Insts = ::Ice::X86NAMESPACE::Insts<TraitsType>; |
2773 template <typename TraitsType> struct Insts { | 2794 template <typename TraitsType> struct Insts { |
| 2795 using GetIP = typename InstImpl<TraitsType>::InstX86GetIP; |
2774 using FakeRMW = typename InstImpl<TraitsType>::InstX86FakeRMW; | 2796 using FakeRMW = typename InstImpl<TraitsType>::InstX86FakeRMW; |
2775 using Label = typename InstImpl<TraitsType>::InstX86Label; | 2797 using Label = typename InstImpl<TraitsType>::InstX86Label; |
2776 | 2798 |
2777 using Call = typename InstImpl<TraitsType>::InstX86Call; | 2799 using Call = typename InstImpl<TraitsType>::InstX86Call; |
2778 | 2800 |
2779 using Br = typename InstImpl<TraitsType>::InstX86Br; | 2801 using Br = typename InstImpl<TraitsType>::InstX86Br; |
2780 using Jmp = typename InstImpl<TraitsType>::InstX86Jmp; | 2802 using Jmp = typename InstImpl<TraitsType>::InstX86Jmp; |
2781 using Bswap = typename InstImpl<TraitsType>::InstX86Bswap; | 2803 using Bswap = typename InstImpl<TraitsType>::InstX86Bswap; |
2782 using Neg = typename InstImpl<TraitsType>::InstX86Neg; | 2804 using Neg = typename InstImpl<TraitsType>::InstX86Neg; |
2783 using Bsf = typename InstImpl<TraitsType>::InstX86Bsf; | 2805 using Bsf = typename InstImpl<TraitsType>::InstX86Bsf; |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3475 &InstImpl<TraitsType>::Assembler::psrl}; \ | 3497 &InstImpl<TraitsType>::Assembler::psrl}; \ |
3476 } \ | 3498 } \ |
3477 } | 3499 } |
3478 | 3500 |
3479 } // end of namespace X86NAMESPACE | 3501 } // end of namespace X86NAMESPACE |
3480 } // end of namespace Ice | 3502 } // end of namespace Ice |
3481 | 3503 |
3482 #include "IceInstX86BaseImpl.h" | 3504 #include "IceInstX86BaseImpl.h" |
3483 | 3505 |
3484 #endif // SUBZERO_SRC_ICEINSTX86BASE_H | 3506 #endif // SUBZERO_SRC_ICEINSTX86BASE_H |
OLD | NEW |