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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 Cvt, | 149 Cvt, |
150 Div, | 150 Div, |
151 Divps, | 151 Divps, |
152 Divss, | 152 Divss, |
153 Fld, | 153 Fld, |
154 Fstp, | 154 Fstp, |
155 Icmp, | 155 Icmp, |
156 Idiv, | 156 Idiv, |
157 Imul, | 157 Imul, |
158 Label, | 158 Label, |
| 159 Lea, |
159 Load, | 160 Load, |
160 Mfence, | 161 Mfence, |
161 Mov, | 162 Mov, |
| 163 Movd, |
162 Movp, | 164 Movp, |
163 Movq, | 165 Movq, |
| 166 Movss, |
164 Movsx, | 167 Movsx, |
165 Movzx, | 168 Movzx, |
166 Mul, | 169 Mul, |
167 Mulps, | 170 Mulps, |
168 Mulss, | 171 Mulss, |
169 Neg, | 172 Neg, |
170 Or, | 173 Or, |
171 Padd, | 174 Padd, |
172 Pand, | 175 Pand, |
173 Pcmpeq, | 176 Pcmpeq, |
174 Pcmpgt, | 177 Pcmpgt, |
| 178 Pextrw, |
| 179 Pinsrw, |
175 Pmullw, | 180 Pmullw, |
176 Pmuludq, | 181 Pmuludq, |
177 Pop, | 182 Pop, |
178 Por, | 183 Por, |
179 Pshufd, | 184 Pshufd, |
180 Psll, | 185 Psll, |
181 Psra, | 186 Psra, |
182 Psub, | 187 Psub, |
183 Push, | 188 Push, |
184 Pxor, | 189 Pxor, |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 // Create a ternary-op instruction like div or idiv. | 428 // Create a ternary-op instruction like div or idiv. |
424 static InstX8632Ternop *create(Cfg *Func, Variable *Dest, Operand *Source1, | 429 static InstX8632Ternop *create(Cfg *Func, Variable *Dest, Operand *Source1, |
425 Operand *Source2) { | 430 Operand *Source2) { |
426 return new (Func->allocate<InstX8632Ternop>()) | 431 return new (Func->allocate<InstX8632Ternop>()) |
427 InstX8632Ternop(Func, Dest, Source1, Source2); | 432 InstX8632Ternop(Func, Dest, Source1, Source2); |
428 } | 433 } |
429 virtual void emit(const Cfg *Func) const { | 434 virtual void emit(const Cfg *Func) const { |
430 Ostream &Str = Func->getContext()->getStrEmit(); | 435 Ostream &Str = Func->getContext()->getStrEmit(); |
431 assert(getSrcSize() == 3); | 436 assert(getSrcSize() == 3); |
432 Str << "\t" << Opcode << "\t"; | 437 Str << "\t" << Opcode << "\t"; |
| 438 getDest()->emit(Func); |
| 439 Str << ", "; |
433 getSrc(1)->emit(Func); | 440 getSrc(1)->emit(Func); |
| 441 Str << ", "; |
| 442 getSrc(2)->emit(Func); |
434 Str << "\n"; | 443 Str << "\n"; |
435 } | 444 } |
436 virtual void dump(const Cfg *Func) const { | 445 virtual void dump(const Cfg *Func) const { |
437 Ostream &Str = Func->getContext()->getStrDump(); | 446 Ostream &Str = Func->getContext()->getStrDump(); |
438 dumpDest(Func); | 447 dumpDest(Func); |
439 Str << " = " << Opcode << "." << getDest()->getType() << " "; | 448 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
440 dumpSources(Func); | 449 dumpSources(Func); |
441 } | 450 } |
442 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 451 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
443 | 452 |
444 private: | 453 private: |
445 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2) | 454 InstX8632Ternop(Cfg *Func, Variable *Dest, Operand *Source1, Operand *Source2) |
446 : InstX8632(Func, K, 3, Dest) { | 455 : InstX8632(Func, K, 3, Dest) { |
447 addSource(Dest); | 456 addSource(Dest); |
448 addSource(Source1); | 457 addSource(Source1); |
449 addSource(Source2); | 458 addSource(Source2); |
450 } | 459 } |
451 InstX8632Ternop(const InstX8632Ternop &) LLVM_DELETED_FUNCTION; | 460 InstX8632Ternop(const InstX8632Ternop &) LLVM_DELETED_FUNCTION; |
452 InstX8632Ternop &operator=(const InstX8632Ternop &) LLVM_DELETED_FUNCTION; | 461 InstX8632Ternop &operator=(const InstX8632Ternop &) LLVM_DELETED_FUNCTION; |
453 virtual ~InstX8632Ternop() {} | 462 virtual ~InstX8632Ternop() {} |
454 static const char *Opcode; | 463 static const char *Opcode; |
455 }; | 464 }; |
456 | 465 |
| 466 // Instructions of the form x := y op z |
| 467 template <InstX8632::InstKindX8632 K> |
| 468 class InstX8632ThreeAddressop : public InstX8632 { |
| 469 public: |
| 470 static InstX8632ThreeAddressop *create(Cfg *Func, Variable *Dest, |
| 471 Operand *Source0, Operand *Source1) { |
| 472 return new (Func->allocate<InstX8632ThreeAddressop>()) |
| 473 InstX8632ThreeAddressop(Func, Dest, Source0, Source1); |
| 474 } |
| 475 virtual void emit(const Cfg *Func) const { |
| 476 Ostream &Str = Func->getContext()->getStrEmit(); |
| 477 assert(getSrcSize() == 2); |
| 478 Str << "\t" << Opcode << "\t"; |
| 479 getDest()->emit(Func); |
| 480 Str << ", "; |
| 481 getSrc(0)->emit(Func); |
| 482 Str << ", "; |
| 483 getSrc(1)->emit(Func); |
| 484 Str << "\n"; |
| 485 } |
| 486 virtual void dump(const Cfg *Func) const { |
| 487 Ostream &Str = Func->getContext()->getStrDump(); |
| 488 dumpDest(Func); |
| 489 Str << " = " << Opcode << "." << getDest()->getType() << " "; |
| 490 dumpSources(Func); |
| 491 } |
| 492 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 493 |
| 494 private: |
| 495 InstX8632ThreeAddressop(Cfg *Func, Variable *Dest, Operand *Source0, |
| 496 Operand *Source1) |
| 497 : InstX8632(Func, K, 2, Dest) { |
| 498 addSource(Source0); |
| 499 addSource(Source1); |
| 500 } |
| 501 InstX8632ThreeAddressop(const InstX8632ThreeAddressop &) |
| 502 LLVM_DELETED_FUNCTION; |
| 503 InstX8632ThreeAddressop & |
| 504 operator=(const InstX8632ThreeAddressop &) LLVM_DELETED_FUNCTION; |
| 505 virtual ~InstX8632ThreeAddressop() {} |
| 506 static const char *Opcode; |
| 507 }; |
| 508 |
457 typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf; | 509 typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf; |
458 typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr; | 510 typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr; |
| 511 typedef InstX8632Unaryop<InstX8632::Lea> InstX8632Lea; |
| 512 typedef InstX8632Unaryop<InstX8632::Movd> InstX8632Movd; |
| 513 typedef InstX8632Unaryop<InstX8632::Movss> InstX8632Movss; |
459 typedef InstX8632Unaryop<InstX8632::Sqrtss> InstX8632Sqrtss; | 514 typedef InstX8632Unaryop<InstX8632::Sqrtss> InstX8632Sqrtss; |
460 typedef InstX8632Binop<InstX8632::Add> InstX8632Add; | 515 typedef InstX8632Binop<InstX8632::Add> InstX8632Add; |
461 typedef InstX8632Binop<InstX8632::Addps> InstX8632Addps; | 516 typedef InstX8632Binop<InstX8632::Addps> InstX8632Addps; |
462 typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc; | 517 typedef InstX8632Binop<InstX8632::Adc> InstX8632Adc; |
463 typedef InstX8632Binop<InstX8632::Addss> InstX8632Addss; | 518 typedef InstX8632Binop<InstX8632::Addss> InstX8632Addss; |
464 typedef InstX8632Binop<InstX8632::Padd> InstX8632Padd; | 519 typedef InstX8632Binop<InstX8632::Padd> InstX8632Padd; |
465 typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub; | 520 typedef InstX8632Binop<InstX8632::Sub> InstX8632Sub; |
466 typedef InstX8632Binop<InstX8632::Subps> InstX8632Subps; | 521 typedef InstX8632Binop<InstX8632::Subps> InstX8632Subps; |
467 typedef InstX8632Binop<InstX8632::Subss> InstX8632Subss; | 522 typedef InstX8632Binop<InstX8632::Subss> InstX8632Subss; |
468 typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb; | 523 typedef InstX8632Binop<InstX8632::Sbb> InstX8632Sbb; |
(...skipping 13 matching lines...) Expand all Loading... |
482 typedef InstX8632Binop<InstX8632::Divss> InstX8632Divss; | 537 typedef InstX8632Binop<InstX8632::Divss> InstX8632Divss; |
483 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; | 538 typedef InstX8632Binop<InstX8632::Shl, true> InstX8632Shl; |
484 typedef InstX8632Binop<InstX8632::Psll> InstX8632Psll; | 539 typedef InstX8632Binop<InstX8632::Psll> InstX8632Psll; |
485 typedef InstX8632Binop<InstX8632::Shr, true> InstX8632Shr; | 540 typedef InstX8632Binop<InstX8632::Shr, true> InstX8632Shr; |
486 typedef InstX8632Binop<InstX8632::Sar, true> InstX8632Sar; | 541 typedef InstX8632Binop<InstX8632::Sar, true> InstX8632Sar; |
487 typedef InstX8632Binop<InstX8632::Psra> InstX8632Psra; | 542 typedef InstX8632Binop<InstX8632::Psra> InstX8632Psra; |
488 typedef InstX8632Binop<InstX8632::Pcmpeq> InstX8632Pcmpeq; | 543 typedef InstX8632Binop<InstX8632::Pcmpeq> InstX8632Pcmpeq; |
489 typedef InstX8632Binop<InstX8632::Pcmpgt> InstX8632Pcmpgt; | 544 typedef InstX8632Binop<InstX8632::Pcmpgt> InstX8632Pcmpgt; |
490 typedef InstX8632Ternop<InstX8632::Idiv> InstX8632Idiv; | 545 typedef InstX8632Ternop<InstX8632::Idiv> InstX8632Idiv; |
491 typedef InstX8632Ternop<InstX8632::Div> InstX8632Div; | 546 typedef InstX8632Ternop<InstX8632::Div> InstX8632Div; |
| 547 typedef InstX8632Ternop<InstX8632::Pinsrw> InstX8632Pinsrw; |
| 548 typedef InstX8632Ternop<InstX8632::Shufps> InstX8632Shufps; |
| 549 typedef InstX8632ThreeAddressop<InstX8632::Pextrw> InstX8632Pextrw; |
| 550 typedef InstX8632ThreeAddressop<InstX8632::Pshufd> InstX8632Pshufd; |
492 | 551 |
493 // Base class for a lockable x86-32 instruction (emits a locked prefix). | 552 // Base class for a lockable x86-32 instruction (emits a locked prefix). |
494 class InstX8632Lockable : public InstX8632 { | 553 class InstX8632Lockable : public InstX8632 { |
495 public: | 554 public: |
496 virtual void emit(const Cfg *Func) const = 0; | 555 virtual void emit(const Cfg *Func) const = 0; |
497 virtual void dump(const Cfg *Func) const; | 556 virtual void dump(const Cfg *Func) const; |
498 | 557 |
499 protected: | 558 protected: |
500 bool Locked; | 559 bool Locked; |
501 | 560 |
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 static bool classof(const Inst *Inst) { return isClassof(Inst, Push); } | 1046 static bool classof(const Inst *Inst) { return isClassof(Inst, Push); } |
988 | 1047 |
989 private: | 1048 private: |
990 InstX8632Push(Cfg *Func, Operand *Source, bool SuppressStackAdjustment); | 1049 InstX8632Push(Cfg *Func, Operand *Source, bool SuppressStackAdjustment); |
991 InstX8632Push(const InstX8632Push &) LLVM_DELETED_FUNCTION; | 1050 InstX8632Push(const InstX8632Push &) LLVM_DELETED_FUNCTION; |
992 InstX8632Push &operator=(const InstX8632Push &) LLVM_DELETED_FUNCTION; | 1051 InstX8632Push &operator=(const InstX8632Push &) LLVM_DELETED_FUNCTION; |
993 bool SuppressStackAdjustment; | 1052 bool SuppressStackAdjustment; |
994 virtual ~InstX8632Push() {} | 1053 virtual ~InstX8632Push() {} |
995 }; | 1054 }; |
996 | 1055 |
997 // Pshufd - shuffle a vector of doublewords | |
998 class InstX8632Pshufd : public InstX8632 { | |
999 public: | |
1000 static InstX8632Pshufd *create(Cfg *Func, Variable *Dest, Operand *Source1, | |
1001 Operand *Source2) { | |
1002 return new (Func->allocate<InstX8632Pshufd>()) | |
1003 InstX8632Pshufd(Func, Dest, Source1, Source2); | |
1004 } | |
1005 virtual void emit(const Cfg *Func) const; | |
1006 virtual void dump(const Cfg *Func) const; | |
1007 static bool classof(const Inst *Inst) { return isClassof(Inst, Pshufd); } | |
1008 | |
1009 private: | |
1010 InstX8632Pshufd(Cfg *Func, Variable *Dest, Operand *Source1, | |
1011 Operand *Source2); | |
1012 InstX8632Pshufd(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION; | |
1013 InstX8632Pshufd &operator=(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION; | |
1014 virtual ~InstX8632Pshufd() {} | |
1015 static const char *Opcode; | |
1016 }; | |
1017 | |
1018 // Ret instruction. Currently only supports the "ret" version that | 1056 // Ret instruction. Currently only supports the "ret" version that |
1019 // does not pop arguments. This instruction takes a Source operand | 1057 // does not pop arguments. This instruction takes a Source operand |
1020 // (for non-void returning functions) for liveness analysis, though | 1058 // (for non-void returning functions) for liveness analysis, though |
1021 // a FakeUse before the ret would do just as well. | 1059 // a FakeUse before the ret would do just as well. |
1022 class InstX8632Ret : public InstX8632 { | 1060 class InstX8632Ret : public InstX8632 { |
1023 public: | 1061 public: |
1024 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) { | 1062 static InstX8632Ret *create(Cfg *Func, Variable *Source = NULL) { |
1025 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); | 1063 return new (Func->allocate<InstX8632Ret>()) InstX8632Ret(Func, Source); |
1026 } | 1064 } |
1027 virtual void emit(const Cfg *Func) const; | 1065 virtual void emit(const Cfg *Func) const; |
1028 virtual void dump(const Cfg *Func) const; | 1066 virtual void dump(const Cfg *Func) const; |
1029 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } | 1067 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } |
1030 | 1068 |
1031 private: | 1069 private: |
1032 InstX8632Ret(Cfg *Func, Variable *Source); | 1070 InstX8632Ret(Cfg *Func, Variable *Source); |
1033 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION; | 1071 InstX8632Ret(const InstX8632Ret &) LLVM_DELETED_FUNCTION; |
1034 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION; | 1072 InstX8632Ret &operator=(const InstX8632Ret &) LLVM_DELETED_FUNCTION; |
1035 virtual ~InstX8632Ret() {} | 1073 virtual ~InstX8632Ret() {} |
1036 }; | 1074 }; |
1037 | 1075 |
1038 // Shufps - select from two vectors of floating point values | |
1039 class InstX8632Shufps : public InstX8632 { | |
1040 public: | |
1041 static InstX8632Shufps *create(Cfg *Func, Variable *Dest, Operand *Source1, | |
1042 Operand *Source2) { | |
1043 return new (Func->allocate<InstX8632Shufps>()) | |
1044 InstX8632Shufps(Func, Dest, Source1, Source2); | |
1045 } | |
1046 virtual void emit(const Cfg *Func) const; | |
1047 virtual void dump(const Cfg *Func) const; | |
1048 static bool classof(const Inst *Inst) { return isClassof(Inst, Shufps); } | |
1049 | |
1050 private: | |
1051 InstX8632Shufps(Cfg *Func, Variable *Dest, Operand *Source1, | |
1052 Operand *Source2); | |
1053 InstX8632Shufps(const InstX8632Shufps &) LLVM_DELETED_FUNCTION; | |
1054 InstX8632Shufps &operator=(const InstX8632Shufps &) LLVM_DELETED_FUNCTION; | |
1055 virtual ~InstX8632Shufps() {} | |
1056 static const char *Opcode; | |
1057 }; | |
1058 | |
1059 // Exchanging Add instruction. Exchanges the first operand (destination | 1076 // Exchanging Add instruction. Exchanges the first operand (destination |
1060 // operand) with the second operand (source operand), then loads the sum | 1077 // operand) with the second operand (source operand), then loads the sum |
1061 // of the two values into the destination operand. The destination may be | 1078 // of the two values into the destination operand. The destination may be |
1062 // a register or memory, while the source must be a register. | 1079 // a register or memory, while the source must be a register. |
1063 // | 1080 // |
1064 // Both the dest and source are updated. The caller should then insert a | 1081 // Both the dest and source are updated. The caller should then insert a |
1065 // FakeDef to reflect the second udpate. | 1082 // FakeDef to reflect the second udpate. |
1066 class InstX8632Xadd : public InstX8632Lockable { | 1083 class InstX8632Xadd : public InstX8632Lockable { |
1067 public: | 1084 public: |
1068 static InstX8632Xadd *create(Cfg *Func, Operand *Dest, Variable *Source, | 1085 static InstX8632Xadd *create(Cfg *Func, Operand *Dest, Variable *Source, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 private: | 1117 private: |
1101 InstX8632Xchg(Cfg *Func, Operand *Dest, Variable *Source); | 1118 InstX8632Xchg(Cfg *Func, Operand *Dest, Variable *Source); |
1102 InstX8632Xchg(const InstX8632Xchg &) LLVM_DELETED_FUNCTION; | 1119 InstX8632Xchg(const InstX8632Xchg &) LLVM_DELETED_FUNCTION; |
1103 InstX8632Xchg &operator=(const InstX8632Xchg &) LLVM_DELETED_FUNCTION; | 1120 InstX8632Xchg &operator=(const InstX8632Xchg &) LLVM_DELETED_FUNCTION; |
1104 virtual ~InstX8632Xchg() {} | 1121 virtual ~InstX8632Xchg() {} |
1105 }; | 1122 }; |
1106 | 1123 |
1107 } // end of namespace Ice | 1124 } // end of namespace Ice |
1108 | 1125 |
1109 #endif // SUBZERO_SRC_ICEINSTX8632_H | 1126 #endif // SUBZERO_SRC_ICEINSTX8632_H |
OLD | NEW |