OLD | NEW |
1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// | 1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// |
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 implements the InstX8632 and OperandX8632 classes, | 10 // This file implements the InstX8632 and OperandX8632 classes, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #define X(tag, cvt, sdss, width) \ | 44 #define X(tag, cvt, sdss, width) \ |
45 { cvt, "" sdss, width } \ | 45 { cvt, "" sdss, width } \ |
46 , | 46 , |
47 ICETYPEX8632_TABLE | 47 ICETYPEX8632_TABLE |
48 #undef X | 48 #undef X |
49 }; | 49 }; |
50 const size_t TypeX8632AttributesSize = | 50 const size_t TypeX8632AttributesSize = |
51 llvm::array_lengthof(TypeX8632Attributes); | 51 llvm::array_lengthof(TypeX8632Attributes); |
52 | 52 |
53 const char *InstX8632SegmentRegNames[] = { | 53 const char *InstX8632SegmentRegNames[] = { |
54 #define X(val, name) \ | 54 #define X(val, name) name, |
55 name, | 55 SEG_REGX8632_TABLE |
56 SEG_REGX8632_TABLE | |
57 #undef X | 56 #undef X |
58 }; | 57 }; |
59 const size_t InstX8632SegmentRegNamesSize = | 58 const size_t InstX8632SegmentRegNamesSize = |
60 llvm::array_lengthof(InstX8632SegmentRegNames); | 59 llvm::array_lengthof(InstX8632SegmentRegNames); |
61 | 60 |
62 } // end of anonymous namespace | 61 } // end of anonymous namespace |
63 | 62 |
64 const char *InstX8632::getWidthString(Type Ty) { | 63 const char *InstX8632::getWidthString(Type Ty) { |
65 return TypeX8632Attributes[Ty].WidthString; | 64 return TypeX8632Attributes[Ty].WidthString; |
66 } | 65 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 } | 132 } |
134 | 133 |
135 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) | 134 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) |
136 : InstX8632(Func, InstX8632::Cdq, 1, Dest) { | 135 : InstX8632(Func, InstX8632::Cdq, 1, Dest) { |
137 assert(Dest->getRegNum() == TargetX8632::Reg_edx); | 136 assert(Dest->getRegNum() == TargetX8632::Reg_edx); |
138 assert(llvm::isa<Variable>(Source)); | 137 assert(llvm::isa<Variable>(Source)); |
139 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); | 138 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); |
140 addSource(Source); | 139 addSource(Source); |
141 } | 140 } |
142 | 141 |
| 142 InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr, |
| 143 Variable *Eax, Variable *Desired, |
| 144 bool Locked) |
| 145 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3, |
| 146 llvm::dyn_cast<Variable>(DestOrAddr), Locked) { |
| 147 assert(Eax->getRegNum() == TargetX8632::Reg_eax); |
| 148 addSource(DestOrAddr); |
| 149 addSource(Eax); |
| 150 addSource(Desired); |
| 151 } |
| 152 |
| 153 InstX8632Cmpxchg8b::InstX8632Cmpxchg8b(Cfg *Func, OperandX8632 *Addr, |
| 154 Variable *Edx, Variable *Eax, |
| 155 Variable *Ecx, Variable *Ebx, |
| 156 bool Locked) |
| 157 : InstX8632Lockable(Func, InstX8632::Cmpxchg, 5, NULL, Locked) { |
| 158 assert(Edx->getRegNum() == TargetX8632::Reg_edx); |
| 159 assert(Eax->getRegNum() == TargetX8632::Reg_eax); |
| 160 assert(Ecx->getRegNum() == TargetX8632::Reg_ecx); |
| 161 assert(Ebx->getRegNum() == TargetX8632::Reg_ebx); |
| 162 addSource(Addr); |
| 163 addSource(Edx); |
| 164 addSource(Eax); |
| 165 addSource(Ecx); |
| 166 addSource(Ebx); |
| 167 } |
| 168 |
143 InstX8632Cvt::InstX8632Cvt(Cfg *Func, Variable *Dest, Operand *Source) | 169 InstX8632Cvt::InstX8632Cvt(Cfg *Func, Variable *Dest, Operand *Source) |
144 : InstX8632(Func, InstX8632::Cvt, 1, Dest) { | 170 : InstX8632(Func, InstX8632::Cvt, 1, Dest) { |
145 addSource(Source); | 171 addSource(Source); |
146 } | 172 } |
147 | 173 |
148 InstX8632Icmp::InstX8632Icmp(Cfg *Func, Operand *Src0, Operand *Src1) | 174 InstX8632Icmp::InstX8632Icmp(Cfg *Func, Operand *Src0, Operand *Src1) |
149 : InstX8632(Func, InstX8632::Icmp, 2, NULL) { | 175 : InstX8632(Func, InstX8632::Icmp, 2, NULL) { |
150 addSource(Src0); | 176 addSource(Src0); |
151 addSource(Src1); | 177 addSource(Src1); |
152 } | 178 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 } | 277 } |
252 | 278 |
253 InstX8632Ret::InstX8632Ret(Cfg *Func, Variable *Source) | 279 InstX8632Ret::InstX8632Ret(Cfg *Func, Variable *Source) |
254 : InstX8632(Func, InstX8632::Ret, Source ? 1 : 0, NULL) { | 280 : InstX8632(Func, InstX8632::Ret, Source ? 1 : 0, NULL) { |
255 if (Source) | 281 if (Source) |
256 addSource(Source); | 282 addSource(Source); |
257 } | 283 } |
258 | 284 |
259 InstX8632Xadd::InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source, | 285 InstX8632Xadd::InstX8632Xadd(Cfg *Func, Operand *Dest, Variable *Source, |
260 bool Locked) | 286 bool Locked) |
261 : InstX8632(Func, InstX8632::Xadd, 2, llvm::dyn_cast<Variable>(Dest)), | 287 : InstX8632Lockable(Func, InstX8632::Xadd, 2, |
262 Locked(Locked) { | 288 llvm::dyn_cast<Variable>(Dest), Locked) { |
263 HasSideEffects = Locked; | |
264 addSource(Dest); | 289 addSource(Dest); |
265 addSource(Source); | 290 addSource(Source); |
266 } | 291 } |
| 292 |
| 293 InstX8632Xchg::InstX8632Xchg(Cfg *Func, Operand *Dest, Variable *Source) |
| 294 : InstX8632(Func, InstX8632::Xchg, 2, llvm::dyn_cast<Variable>(Dest)) { |
| 295 addSource(Dest); |
| 296 addSource(Source); |
| 297 } |
267 | 298 |
268 // ======================== Dump routines ======================== // | 299 // ======================== Dump routines ======================== // |
269 | 300 |
270 void InstX8632::dump(const Cfg *Func) const { | 301 void InstX8632::dump(const Cfg *Func) const { |
271 Ostream &Str = Func->getContext()->getStrDump(); | 302 Ostream &Str = Func->getContext()->getStrDump(); |
272 Str << "[X8632] "; | 303 Str << "[X8632] "; |
273 Inst::dump(Func); | 304 Inst::dump(Func); |
274 } | 305 } |
275 | 306 |
276 void InstX8632Label::emit(const Cfg *Func) const { | 307 void InstX8632Label::emit(const Cfg *Func) const { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 if (ShiftReg && ShiftReg->getRegNum() == TargetX8632::Reg_ecx) { | 396 if (ShiftReg && ShiftReg->getRegNum() == TargetX8632::Reg_ecx) { |
366 Str << "cl"; | 397 Str << "cl"; |
367 EmittedSrc1 = true; | 398 EmittedSrc1 = true; |
368 } | 399 } |
369 } | 400 } |
370 if (!EmittedSrc1) | 401 if (!EmittedSrc1) |
371 Inst->getSrc(1)->emit(Func); | 402 Inst->getSrc(1)->emit(Func); |
372 Str << "\n"; | 403 Str << "\n"; |
373 } | 404 } |
374 | 405 |
| 406 template <> const char *InstX8632Neg::Opcode = "neg"; |
375 template <> const char *InstX8632Add::Opcode = "add"; | 407 template <> const char *InstX8632Add::Opcode = "add"; |
376 template <> const char *InstX8632Adc::Opcode = "adc"; | 408 template <> const char *InstX8632Adc::Opcode = "adc"; |
377 template <> const char *InstX8632Addss::Opcode = "addss"; | 409 template <> const char *InstX8632Addss::Opcode = "addss"; |
378 template <> const char *InstX8632Sub::Opcode = "sub"; | 410 template <> const char *InstX8632Sub::Opcode = "sub"; |
379 template <> const char *InstX8632Subss::Opcode = "subss"; | 411 template <> const char *InstX8632Subss::Opcode = "subss"; |
380 template <> const char *InstX8632Sbb::Opcode = "sbb"; | 412 template <> const char *InstX8632Sbb::Opcode = "sbb"; |
381 template <> const char *InstX8632And::Opcode = "and"; | 413 template <> const char *InstX8632And::Opcode = "and"; |
382 template <> const char *InstX8632Or::Opcode = "or"; | 414 template <> const char *InstX8632Or::Opcode = "or"; |
383 template <> const char *InstX8632Xor::Opcode = "xor"; | 415 template <> const char *InstX8632Xor::Opcode = "xor"; |
384 template <> const char *InstX8632Imul::Opcode = "imul"; | 416 template <> const char *InstX8632Imul::Opcode = "imul"; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 Str << "\tcdq\n"; | 548 Str << "\tcdq\n"; |
517 } | 549 } |
518 | 550 |
519 void InstX8632Cdq::dump(const Cfg *Func) const { | 551 void InstX8632Cdq::dump(const Cfg *Func) const { |
520 Ostream &Str = Func->getContext()->getStrDump(); | 552 Ostream &Str = Func->getContext()->getStrDump(); |
521 dumpDest(Func); | 553 dumpDest(Func); |
522 Str << " = cdq." << getSrc(0)->getType() << " "; | 554 Str << " = cdq." << getSrc(0)->getType() << " "; |
523 dumpSources(Func); | 555 dumpSources(Func); |
524 } | 556 } |
525 | 557 |
| 558 void InstX8632Cmpxchg::emit(const Cfg *Func) const { |
| 559 Ostream &Str = Func->getContext()->getStrEmit(); |
| 560 assert(getSrcSize() == 3); |
| 561 if (Locked) { |
| 562 Str << "\tlock"; |
| 563 } |
| 564 Str << "\tcmpxchg\t"; |
| 565 getSrc(0)->emit(Func); |
| 566 Str << ", "; |
| 567 getSrc(2)->emit(Func); |
| 568 Str << "\n"; |
| 569 } |
| 570 |
| 571 void InstX8632Cmpxchg::dump(const Cfg *Func) const { |
| 572 Ostream &Str = Func->getContext()->getStrDump(); |
| 573 if (Locked) { |
| 574 Str << "lock "; |
| 575 } |
| 576 Str << "cmpxchg." << getSrc(0)->getType() << " "; |
| 577 dumpSources(Func); |
| 578 } |
| 579 |
| 580 void InstX8632Cmpxchg8b::emit(const Cfg *Func) const { |
| 581 Ostream &Str = Func->getContext()->getStrEmit(); |
| 582 assert(getSrcSize() == 5); |
| 583 if (Locked) { |
| 584 Str << "\tlock"; |
| 585 } |
| 586 Str << "\tcmpxchg8b\t"; |
| 587 getSrc(0)->emit(Func); |
| 588 Str << "\n"; |
| 589 } |
| 590 |
| 591 void InstX8632Cmpxchg8b::dump(const Cfg *Func) const { |
| 592 Ostream &Str = Func->getContext()->getStrDump(); |
| 593 if (Locked) { |
| 594 Str << "lock "; |
| 595 } |
| 596 Str << "cmpxchg8b "; |
| 597 dumpSources(Func); |
| 598 } |
| 599 |
526 void InstX8632Cvt::emit(const Cfg *Func) const { | 600 void InstX8632Cvt::emit(const Cfg *Func) const { |
527 Ostream &Str = Func->getContext()->getStrEmit(); | 601 Ostream &Str = Func->getContext()->getStrEmit(); |
528 assert(getSrcSize() == 1); | 602 assert(getSrcSize() == 1); |
529 Str << "\tcvts" << TypeX8632Attributes[getSrc(0)->getType()].CvtString << "2s" | 603 Str << "\tcvts" << TypeX8632Attributes[getSrc(0)->getType()].CvtString << "2s" |
530 << TypeX8632Attributes[getDest()->getType()].CvtString << "\t"; | 604 << TypeX8632Attributes[getDest()->getType()].CvtString << "\t"; |
531 getDest()->emit(Func); | 605 getDest()->emit(Func); |
532 Str << ", "; | 606 Str << ", "; |
533 getSrc(0)->emit(Func); | 607 getSrc(0)->emit(Func); |
534 Str << "\n"; | 608 Str << "\n"; |
535 } | 609 } |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 void InstX8632Ret::dump(const Cfg *Func) const { | 945 void InstX8632Ret::dump(const Cfg *Func) const { |
872 Ostream &Str = Func->getContext()->getStrDump(); | 946 Ostream &Str = Func->getContext()->getStrDump(); |
873 Type Ty = (getSrcSize() == 0 ? IceType_void : getSrc(0)->getType()); | 947 Type Ty = (getSrcSize() == 0 ? IceType_void : getSrc(0)->getType()); |
874 Str << "ret." << Ty << " "; | 948 Str << "ret." << Ty << " "; |
875 dumpSources(Func); | 949 dumpSources(Func); |
876 } | 950 } |
877 | 951 |
878 void InstX8632Xadd::emit(const Cfg *Func) const { | 952 void InstX8632Xadd::emit(const Cfg *Func) const { |
879 Ostream &Str = Func->getContext()->getStrEmit(); | 953 Ostream &Str = Func->getContext()->getStrEmit(); |
880 if (Locked) { | 954 if (Locked) { |
881 Str << "\tlock xadd "; | 955 Str << "\tlock"; |
882 } else { | |
883 Str << "\txadd\t"; | |
884 } | 956 } |
| 957 Str << "\txadd\t"; |
885 getSrc(0)->emit(Func); | 958 getSrc(0)->emit(Func); |
886 Str << ", "; | 959 Str << ", "; |
887 getSrc(1)->emit(Func); | 960 getSrc(1)->emit(Func); |
888 Str << "\n"; | 961 Str << "\n"; |
889 } | 962 } |
890 | 963 |
891 void InstX8632Xadd::dump(const Cfg *Func) const { | 964 void InstX8632Xadd::dump(const Cfg *Func) const { |
892 Ostream &Str = Func->getContext()->getStrDump(); | 965 Ostream &Str = Func->getContext()->getStrDump(); |
893 if (Locked) { | 966 if (Locked) { |
894 Str << "lock "; | 967 Str << "lock "; |
895 } | 968 } |
896 Type Ty = getSrc(0)->getType(); | 969 Type Ty = getSrc(0)->getType(); |
897 Str << "xadd." << Ty << " "; | 970 Str << "xadd." << Ty << " "; |
898 dumpSources(Func); | 971 dumpSources(Func); |
899 } | 972 } |
900 | 973 |
| 974 void InstX8632Xchg::emit(const Cfg *Func) const { |
| 975 Ostream &Str = Func->getContext()->getStrEmit(); |
| 976 Str << "\txchg\t"; |
| 977 getSrc(0)->emit(Func); |
| 978 Str << ", "; |
| 979 getSrc(1)->emit(Func); |
| 980 Str << "\n"; |
| 981 } |
| 982 |
| 983 void InstX8632Xchg::dump(const Cfg *Func) const { |
| 984 Ostream &Str = Func->getContext()->getStrDump(); |
| 985 Type Ty = getSrc(0)->getType(); |
| 986 Str << "xchg." << Ty << " "; |
| 987 dumpSources(Func); |
| 988 } |
| 989 |
901 void OperandX8632::dump(const Cfg *Func) const { | 990 void OperandX8632::dump(const Cfg *Func) const { |
902 Ostream &Str = Func->getContext()->getStrDump(); | 991 Ostream &Str = Func->getContext()->getStrDump(); |
903 Str << "<OperandX8632>"; | 992 Str << "<OperandX8632>"; |
904 } | 993 } |
905 | 994 |
906 void OperandX8632Mem::emit(const Cfg *Func) const { | 995 void OperandX8632Mem::emit(const Cfg *Func) const { |
907 Ostream &Str = Func->getContext()->getStrEmit(); | 996 Ostream &Str = Func->getContext()->getStrEmit(); |
908 Str << TypeX8632Attributes[getType()].WidthString << " "; | 997 Str << TypeX8632Attributes[getType()].WidthString << " "; |
909 if (SegmentReg != DefaultSegment) { | 998 if (SegmentReg != DefaultSegment) { |
910 assert(SegmentReg >= 0 && | 999 assert(SegmentReg >= 0 && |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 default: | 1113 default: |
1025 Str << "???"; | 1114 Str << "???"; |
1026 break; | 1115 break; |
1027 } | 1116 } |
1028 Str << "("; | 1117 Str << "("; |
1029 Var->dump(Func); | 1118 Var->dump(Func); |
1030 Str << ")"; | 1119 Str << ")"; |
1031 } | 1120 } |
1032 | 1121 |
1033 } // end of namespace Ice | 1122 } // end of namespace Ice |
OLD | NEW |