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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 }; | 130 }; |
131 | 131 |
132 class InstX8632 : public InstTarget { | 132 class InstX8632 : public InstTarget { |
133 public: | 133 public: |
134 enum InstKindX8632 { | 134 enum InstKindX8632 { |
135 k__Start = Inst::Target, | 135 k__Start = Inst::Target, |
136 Adc, | 136 Adc, |
137 Add, | 137 Add, |
138 Addps, | 138 Addps, |
139 Addss, | 139 Addss, |
| 140 Adjuststack, |
140 And, | 141 And, |
141 Blendvps, | 142 Blendvps, |
142 Br, | 143 Br, |
143 Bsf, | 144 Bsf, |
144 Bsr, | 145 Bsr, |
145 Bswap, | 146 Bswap, |
146 Call, | 147 Call, |
147 Cdq, | 148 Cdq, |
148 Cmov, | 149 Cmov, |
149 Cmpps, | 150 Cmpps, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 Rol, | 198 Rol, |
198 Sar, | 199 Sar, |
199 Sbb, | 200 Sbb, |
200 Shl, | 201 Shl, |
201 Shld, | 202 Shld, |
202 Shr, | 203 Shr, |
203 Shrd, | 204 Shrd, |
204 Shufps, | 205 Shufps, |
205 Sqrtss, | 206 Sqrtss, |
206 Store, | 207 Store, |
| 208 StoreP, |
207 StoreQ, | 209 StoreQ, |
208 Sub, | 210 Sub, |
209 Subps, | 211 Subps, |
210 Subss, | 212 Subss, |
211 Test, | 213 Test, |
212 Ucomiss, | 214 Ucomiss, |
213 UD2, | 215 UD2, |
214 Xadd, | 216 Xadd, |
215 Xchg, | 217 Xchg, |
216 Xor | 218 Xor |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 InstX8632Label *Label, BrCond Condition); | 335 InstX8632Label *Label, BrCond Condition); |
334 InstX8632Br(const InstX8632Br &) LLVM_DELETED_FUNCTION; | 336 InstX8632Br(const InstX8632Br &) LLVM_DELETED_FUNCTION; |
335 InstX8632Br &operator=(const InstX8632Br &) LLVM_DELETED_FUNCTION; | 337 InstX8632Br &operator=(const InstX8632Br &) LLVM_DELETED_FUNCTION; |
336 virtual ~InstX8632Br() {} | 338 virtual ~InstX8632Br() {} |
337 BrCond Condition; | 339 BrCond Condition; |
338 CfgNode *TargetTrue; | 340 CfgNode *TargetTrue; |
339 CfgNode *TargetFalse; | 341 CfgNode *TargetFalse; |
340 InstX8632Label *Label; // Intra-block branch target | 342 InstX8632Label *Label; // Intra-block branch target |
341 }; | 343 }; |
342 | 344 |
| 345 // AdjustStack instruction - subtracts esp by the given amount and |
| 346 // updates the stack offset during code emission. |
| 347 class InstX8632AdjustStack : public InstX8632 { |
| 348 public: |
| 349 static InstX8632AdjustStack *create(Cfg *Func, SizeT Amount) { |
| 350 return new (Func->allocate<InstX8632AdjustStack>()) |
| 351 InstX8632AdjustStack(Func, Amount); |
| 352 } |
| 353 virtual void emit(const Cfg *Func) const; |
| 354 virtual void dump(const Cfg *Func) const; |
| 355 static bool classof(const Inst *Inst) { return isClassof(Inst, Adjuststack); } |
| 356 |
| 357 private: |
| 358 InstX8632AdjustStack(Cfg *Func, SizeT Amount); |
| 359 InstX8632AdjustStack(const InstX8632AdjustStack &) LLVM_DELETED_FUNCTION; |
| 360 InstX8632AdjustStack &operator=(const InstX8632AdjustStack &) |
| 361 LLVM_DELETED_FUNCTION; |
| 362 SizeT Amount; |
| 363 }; |
| 364 |
343 // Call instruction. Arguments should have already been pushed. | 365 // Call instruction. Arguments should have already been pushed. |
344 class InstX8632Call : public InstX8632 { | 366 class InstX8632Call : public InstX8632 { |
345 public: | 367 public: |
346 static InstX8632Call *create(Cfg *Func, Variable *Dest, Operand *CallTarget) { | 368 static InstX8632Call *create(Cfg *Func, Variable *Dest, Operand *CallTarget) { |
347 return new (Func->allocate<InstX8632Call>()) | 369 return new (Func->allocate<InstX8632Call>()) |
348 InstX8632Call(Func, Dest, CallTarget); | 370 InstX8632Call(Func, Dest, CallTarget); |
349 } | 371 } |
350 Operand *getCallTarget() const { return getSrc(0); } | 372 Operand *getCallTarget() const { return getSrc(0); } |
351 virtual void emit(const Cfg *Func) const; | 373 virtual void emit(const Cfg *Func) const; |
352 virtual void dump(const Cfg *Func) const; | 374 virtual void dump(const Cfg *Func) const; |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 virtual void dump(const Cfg *Func) const; | 991 virtual void dump(const Cfg *Func) const; |
970 static bool classof(const Inst *Inst) { return isClassof(Inst, Movp); } | 992 static bool classof(const Inst *Inst) { return isClassof(Inst, Movp); } |
971 | 993 |
972 private: | 994 private: |
973 InstX8632Movp(Cfg *Func, Variable *Dest, Operand *Source); | 995 InstX8632Movp(Cfg *Func, Variable *Dest, Operand *Source); |
974 InstX8632Movp(const InstX8632Movp &) LLVM_DELETED_FUNCTION; | 996 InstX8632Movp(const InstX8632Movp &) LLVM_DELETED_FUNCTION; |
975 InstX8632Movp &operator=(const InstX8632Movp &) LLVM_DELETED_FUNCTION; | 997 InstX8632Movp &operator=(const InstX8632Movp &) LLVM_DELETED_FUNCTION; |
976 virtual ~InstX8632Movp() {} | 998 virtual ~InstX8632Movp() {} |
977 }; | 999 }; |
978 | 1000 |
| 1001 class InstX8632StoreP : public InstX8632 { |
| 1002 public: |
| 1003 static InstX8632StoreP *create(Cfg *Func, Operand *Value, OperandX8632 *Mem) { |
| 1004 return new (Func->allocate<InstX8632StoreP>()) |
| 1005 InstX8632StoreP(Func, Value, Mem); |
| 1006 } |
| 1007 virtual void emit(const Cfg *Func) const; |
| 1008 virtual void dump(const Cfg *Func) const; |
| 1009 static bool classof(const Inst *Inst) { return isClassof(Inst, StoreP); } |
| 1010 |
| 1011 private: |
| 1012 InstX8632StoreP(Cfg *Func, Operand *Value, OperandX8632 *Mem); |
| 1013 InstX8632StoreP(const InstX8632StoreP &) LLVM_DELETED_FUNCTION; |
| 1014 InstX8632StoreP &operator=(const InstX8632StoreP &) LLVM_DELETED_FUNCTION; |
| 1015 virtual ~InstX8632StoreP() {} |
| 1016 }; |
| 1017 |
979 // This is essentially a "movq" instruction with an OperandX8632Mem | 1018 // This is essentially a "movq" instruction with an OperandX8632Mem |
980 // operand instead of Variable as the destination. It's important | 1019 // operand instead of Variable as the destination. It's important |
981 // for liveness that there is no Dest operand. | 1020 // for liveness that there is no Dest operand. |
982 class InstX8632StoreQ : public InstX8632 { | 1021 class InstX8632StoreQ : public InstX8632 { |
983 public: | 1022 public: |
984 static InstX8632StoreQ *create(Cfg *Func, Operand *Value, OperandX8632 *Mem) { | 1023 static InstX8632StoreQ *create(Cfg *Func, Operand *Value, OperandX8632 *Mem) { |
985 return new (Func->allocate<InstX8632StoreQ>()) | 1024 return new (Func->allocate<InstX8632StoreQ>()) |
986 InstX8632StoreQ(Func, Value, Mem); | 1025 InstX8632StoreQ(Func, Value, Mem); |
987 } | 1026 } |
988 virtual void emit(const Cfg *Func) const; | 1027 virtual void emit(const Cfg *Func) const; |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; | 1250 template <> void InstX8632Pmuludq::emit(const Cfg *Func) const; |
1212 template <> void InstX8632Psll::emit(const Cfg *Func) const; | 1251 template <> void InstX8632Psll::emit(const Cfg *Func) const; |
1213 template <> void InstX8632Psra::emit(const Cfg *Func) const; | 1252 template <> void InstX8632Psra::emit(const Cfg *Func) const; |
1214 template <> void InstX8632Psub::emit(const Cfg *Func) const; | 1253 template <> void InstX8632Psub::emit(const Cfg *Func) const; |
1215 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; | 1254 template <> void InstX8632Sqrtss::emit(const Cfg *Func) const; |
1216 template <> void InstX8632Subss::emit(const Cfg *Func) const; | 1255 template <> void InstX8632Subss::emit(const Cfg *Func) const; |
1217 | 1256 |
1218 } // end of namespace Ice | 1257 } // end of namespace Ice |
1219 | 1258 |
1220 #endif // SUBZERO_SRC_ICEINSTX8632_H | 1259 #endif // SUBZERO_SRC_ICEINSTX8632_H |
OLD | NEW |