| 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 15 matching lines...) Expand all Loading... |
| 26 const struct InstX8632BrAttributes_ { | 26 const struct InstX8632BrAttributes_ { |
| 27 const char *DisplayString; | 27 const char *DisplayString; |
| 28 const char *EmitString; | 28 const char *EmitString; |
| 29 } InstX8632BrAttributes[] = { | 29 } InstX8632BrAttributes[] = { |
| 30 #define X(tag, dump, emit) \ | 30 #define X(tag, dump, emit) \ |
| 31 { dump, emit } \ | 31 { dump, emit } \ |
| 32 , | 32 , |
| 33 ICEINSTX8632BR_TABLE | 33 ICEINSTX8632BR_TABLE |
| 34 #undef X | 34 #undef X |
| 35 }; | 35 }; |
| 36 const size_t InstX8632BrAttributesSize = | |
| 37 llvm::array_lengthof(InstX8632BrAttributes); | |
| 38 | 36 |
| 39 const struct InstX8632CmppsAttributes_ { | 37 const struct InstX8632CmppsAttributes_ { |
| 40 const char *EmitString; | 38 const char *EmitString; |
| 41 } InstX8632CmppsAttributes[] = { | 39 } InstX8632CmppsAttributes[] = { |
| 42 #define X(tag, emit) \ | 40 #define X(tag, emit) \ |
| 43 { emit } \ | 41 { emit } \ |
| 44 , | 42 , |
| 45 ICEINSTX8632CMPPS_TABLE | 43 ICEINSTX8632CMPPS_TABLE |
| 46 #undef X | 44 #undef X |
| 47 }; | 45 }; |
| 48 const size_t InstX8632CmppsAttributesSize = | |
| 49 llvm::array_lengthof(InstX8632CmppsAttributes); | |
| 50 | 46 |
| 51 const struct TypeX8632Attributes_ { | 47 const struct TypeX8632Attributes_ { |
| 52 const char *CvtString; // i (integer), s (single FP), d (double FP) | 48 const char *CvtString; // i (integer), s (single FP), d (double FP) |
| 53 const char *SdSsString; // ss, sd, or <blank> | 49 const char *SdSsString; // ss, sd, or <blank> |
| 54 const char *PackString; // b, w, d, or <blank> | 50 const char *PackString; // b, w, d, or <blank> |
| 55 const char *WidthString; // {byte,word,dword,qword} ptr | 51 const char *WidthString; // {byte,word,dword,qword} ptr |
| 56 } TypeX8632Attributes[] = { | 52 } TypeX8632Attributes[] = { |
| 57 #define X(tag, elementty, cvt, sdss, pack, width) \ | 53 #define X(tag, elementty, cvt, sdss, pack, width) \ |
| 58 { cvt, "" sdss, pack, width } \ | 54 { cvt, "" sdss, pack, width } \ |
| 59 , | 55 , |
| 60 ICETYPEX8632_TABLE | 56 ICETYPEX8632_TABLE |
| 61 #undef X | 57 #undef X |
| 62 }; | 58 }; |
| 63 const size_t TypeX8632AttributesSize = | |
| 64 llvm::array_lengthof(TypeX8632Attributes); | |
| 65 | 59 |
| 66 const char *InstX8632SegmentRegNames[] = { | 60 const char *InstX8632SegmentRegNames[] = { |
| 67 #define X(val, name) name, | 61 #define X(val, name) name, |
| 68 SEG_REGX8632_TABLE | 62 SEG_REGX8632_TABLE |
| 69 #undef X | 63 #undef X |
| 70 }; | 64 }; |
| 71 const size_t InstX8632SegmentRegNamesSize = | |
| 72 llvm::array_lengthof(InstX8632SegmentRegNames); | |
| 73 | 65 |
| 74 } // end of anonymous namespace | 66 } // end of anonymous namespace |
| 75 | 67 |
| 76 const char *InstX8632::getWidthString(Type Ty) { | 68 const char *InstX8632::getWidthString(Type Ty) { |
| 77 return TypeX8632Attributes[Ty].WidthString; | 69 return TypeX8632Attributes[Ty].WidthString; |
| 78 } | 70 } |
| 79 | 71 |
| 80 OperandX8632Mem::OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, | 72 OperandX8632Mem::OperandX8632Mem(Cfg *Func, Type Ty, Variable *Base, |
| 81 Constant *Offset, Variable *Index, | 73 Constant *Offset, Variable *Index, |
| 82 uint16_t Shift, SegmentRegisters SegmentReg) | 74 uint16_t Shift, SegmentRegisters SegmentReg) |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "."; | 751 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "."; |
| 760 Str << getDest()->getType() << " "; | 752 Str << getDest()->getType() << " "; |
| 761 dumpDest(Func); | 753 dumpDest(Func); |
| 762 Str << ", "; | 754 Str << ", "; |
| 763 dumpSources(Func); | 755 dumpSources(Func); |
| 764 } | 756 } |
| 765 | 757 |
| 766 void InstX8632Cmpps::emit(const Cfg *Func) const { | 758 void InstX8632Cmpps::emit(const Cfg *Func) const { |
| 767 Ostream &Str = Func->getContext()->getStrEmit(); | 759 Ostream &Str = Func->getContext()->getStrEmit(); |
| 768 assert(getSrcSize() == 2); | 760 assert(getSrcSize() == 2); |
| 769 assert(Condition < InstX8632CmppsAttributesSize); | 761 assert(Condition < Cmpps_Invalid); |
| 770 Str << "\t"; | 762 Str << "\t"; |
| 771 Str << "cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps" | 763 Str << "cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps" |
| 772 << "\t"; | 764 << "\t"; |
| 773 getDest()->emit(Func); | 765 getDest()->emit(Func); |
| 774 Str << ", "; | 766 Str << ", "; |
| 775 getSrc(1)->emit(Func); | 767 getSrc(1)->emit(Func); |
| 776 Str << "\n"; | 768 Str << "\n"; |
| 777 } | 769 } |
| 778 | 770 |
| 779 void InstX8632Cmpps::dump(const Cfg *Func) const { | 771 void InstX8632Cmpps::dump(const Cfg *Func) const { |
| 780 Ostream &Str = Func->getContext()->getStrDump(); | 772 Ostream &Str = Func->getContext()->getStrDump(); |
| 781 assert(Condition < InstX8632CmppsAttributesSize); | 773 assert(Condition < Cmpps_Invalid); |
| 782 dumpDest(Func); | 774 dumpDest(Func); |
| 783 Str << " = cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps" | 775 Str << " = cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps" |
| 784 << "\t"; | 776 << "\t"; |
| 785 dumpSources(Func); | 777 dumpSources(Func); |
| 786 } | 778 } |
| 787 | 779 |
| 788 void InstX8632Cmpxchg::emit(const Cfg *Func) const { | 780 void InstX8632Cmpxchg::emit(const Cfg *Func) const { |
| 789 Ostream &Str = Func->getContext()->getStrEmit(); | 781 Ostream &Str = Func->getContext()->getStrEmit(); |
| 790 assert(getSrcSize() == 3); | 782 assert(getSrcSize() == 3); |
| 791 if (Locked) { | 783 if (Locked) { |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 | 1345 |
| 1354 void OperandX8632::dump(const Cfg *Func) const { | 1346 void OperandX8632::dump(const Cfg *Func) const { |
| 1355 Ostream &Str = Func->getContext()->getStrDump(); | 1347 Ostream &Str = Func->getContext()->getStrDump(); |
| 1356 Str << "<OperandX8632>"; | 1348 Str << "<OperandX8632>"; |
| 1357 } | 1349 } |
| 1358 | 1350 |
| 1359 void OperandX8632Mem::emit(const Cfg *Func) const { | 1351 void OperandX8632Mem::emit(const Cfg *Func) const { |
| 1360 Ostream &Str = Func->getContext()->getStrEmit(); | 1352 Ostream &Str = Func->getContext()->getStrEmit(); |
| 1361 Str << TypeX8632Attributes[getType()].WidthString << " "; | 1353 Str << TypeX8632Attributes[getType()].WidthString << " "; |
| 1362 if (SegmentReg != DefaultSegment) { | 1354 if (SegmentReg != DefaultSegment) { |
| 1363 assert(SegmentReg >= 0 && | 1355 assert(SegmentReg >= 0 && SegmentReg < SegReg_NUM); |
| 1364 static_cast<size_t>(SegmentReg) < InstX8632SegmentRegNamesSize); | |
| 1365 Str << InstX8632SegmentRegNames[SegmentReg] << ":"; | 1356 Str << InstX8632SegmentRegNames[SegmentReg] << ":"; |
| 1366 } | 1357 } |
| 1367 // TODO: The following is an almost verbatim paste of dump(). | 1358 // TODO: The following is an almost verbatim paste of dump(). |
| 1368 bool Dumped = false; | 1359 bool Dumped = false; |
| 1369 Str << "["; | 1360 Str << "["; |
| 1370 if (Base) { | 1361 if (Base) { |
| 1371 Base->emit(Func); | 1362 Base->emit(Func); |
| 1372 Dumped = true; | 1363 Dumped = true; |
| 1373 } | 1364 } |
| 1374 if (Index) { | 1365 if (Index) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1397 } else { | 1388 } else { |
| 1398 // There is only the offset. | 1389 // There is only the offset. |
| 1399 Offset->emit(Func); | 1390 Offset->emit(Func); |
| 1400 } | 1391 } |
| 1401 Str << "]"; | 1392 Str << "]"; |
| 1402 } | 1393 } |
| 1403 | 1394 |
| 1404 void OperandX8632Mem::dump(const Cfg *Func) const { | 1395 void OperandX8632Mem::dump(const Cfg *Func) const { |
| 1405 Ostream &Str = Func->getContext()->getStrDump(); | 1396 Ostream &Str = Func->getContext()->getStrDump(); |
| 1406 if (SegmentReg != DefaultSegment) { | 1397 if (SegmentReg != DefaultSegment) { |
| 1407 assert(SegmentReg >= 0 && | 1398 assert(SegmentReg >= 0 && SegmentReg < SegReg_NUM); |
| 1408 static_cast<size_t>(SegmentReg) < InstX8632SegmentRegNamesSize); | |
| 1409 Str << InstX8632SegmentRegNames[SegmentReg] << ":"; | 1399 Str << InstX8632SegmentRegNames[SegmentReg] << ":"; |
| 1410 } | 1400 } |
| 1411 bool Dumped = false; | 1401 bool Dumped = false; |
| 1412 Str << "["; | 1402 Str << "["; |
| 1413 if (Base) { | 1403 if (Base) { |
| 1414 Base->dump(Func); | 1404 Base->dump(Func); |
| 1415 Dumped = true; | 1405 Dumped = true; |
| 1416 } | 1406 } |
| 1417 if (Index) { | 1407 if (Index) { |
| 1418 assert(Base); | 1408 assert(Base); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 default: | 1467 default: |
| 1478 Str << "???"; | 1468 Str << "???"; |
| 1479 break; | 1469 break; |
| 1480 } | 1470 } |
| 1481 Str << "("; | 1471 Str << "("; |
| 1482 Var->dump(Func); | 1472 Var->dump(Func); |
| 1483 Str << ")"; | 1473 Str << ")"; |
| 1484 } | 1474 } |
| 1485 | 1475 |
| 1486 } // end of namespace Ice | 1476 } // end of namespace Ice |
| OLD | NEW |