Chromium Code Reviews| 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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 InstX8632Label *Label, InstX8632::BrCond Condition) | 129 InstX8632Label *Label, InstX8632::BrCond Condition) |
| 130 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition), | 130 : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition), |
| 131 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {} | 131 TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {} |
| 132 | 132 |
| 133 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget) | 133 InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget) |
| 134 : InstX8632(Func, InstX8632::Call, 1, Dest) { | 134 : InstX8632(Func, InstX8632::Call, 1, Dest) { |
| 135 HasSideEffects = true; | 135 HasSideEffects = true; |
| 136 addSource(CallTarget); | 136 addSource(CallTarget); |
| 137 } | 137 } |
| 138 | 138 |
| 139 InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) | 139 InstX8632Cbwdq::InstX8632Cbwdq(Cfg *Func, Variable *Dest, Operand *Source) |
| 140 : InstX8632(Func, InstX8632::Cdq, 1, Dest) { | 140 : InstX8632(Func, InstX8632::Cbwdq, 1, Dest) { |
| 141 assert(Dest->getRegNum() == TargetX8632::Reg_edx); | |
| 142 assert(llvm::isa<Variable>(Source)); | |
| 143 assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); | |
| 144 addSource(Source); | 141 addSource(Source); |
| 145 } | 142 } |
| 146 | 143 |
| 147 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, | 144 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, |
| 148 InstX8632::BrCond Condition) | 145 InstX8632::BrCond Condition) |
| 149 : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) { | 146 : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) { |
| 150 // The final result is either the original Dest, or Source, so mark | 147 // The final result is either the original Dest, or Source, so mark |
| 151 // both as sources. | 148 // both as sources. |
| 152 addSource(Dest); | 149 addSource(Dest); |
| 153 addSource(Source); | 150 addSource(Source); |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 714 Str << "\n"; | 711 Str << "\n"; |
| 715 } | 712 } |
| 716 | 713 |
| 717 void InstX8632Shrd::dump(const Cfg *Func) const { | 714 void InstX8632Shrd::dump(const Cfg *Func) const { |
| 718 Ostream &Str = Func->getContext()->getStrDump(); | 715 Ostream &Str = Func->getContext()->getStrDump(); |
| 719 dumpDest(Func); | 716 dumpDest(Func); |
| 720 Str << " = shrd." << getDest()->getType() << " "; | 717 Str << " = shrd." << getDest()->getType() << " "; |
| 721 dumpSources(Func); | 718 dumpSources(Func); |
| 722 } | 719 } |
| 723 | 720 |
| 724 void InstX8632Cdq::emit(const Cfg *Func) const { | 721 void InstX8632Cbwdq::emit(const Cfg *Func) const { |
| 725 Ostream &Str = Func->getContext()->getStrEmit(); | 722 Ostream &Str = Func->getContext()->getStrEmit(); |
| 726 assert(getSrcSize() == 1); | 723 assert(getSrcSize() == 1); |
| 727 Str << "\tcdq\n"; | 724 Variable *Dest = getDest(); |
| 725 (void)Dest; | |
| 726 Operand *Src0 = getSrc(0); | |
| 727 assert(llvm::isa<Variable>(Dest)); | |
|
Jim Stichnoth
2014/08/07 19:58:10
This is redundant, since Dest is types as a Variab
wala
2014/08/07 20:30:35
Woops, done.
| |
| 728 assert(llvm::isa<Variable>(Src0)); | |
| 729 assert(llvm::cast<Variable>(Src0)->getRegNum() == TargetX8632::Reg_eax); | |
| 730 switch (Src0->getType()) { | |
| 731 default: | |
| 732 llvm_unreachable("unexpected source type!"); | |
| 733 break; | |
| 734 case IceType_i8: | |
| 735 assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_eax); | |
|
Jim Stichnoth
2014/08/07 19:58:10
Don't need to cast Dest to Variable, here and belo
wala
2014/08/07 20:30:35
Done.
| |
| 736 Str << "\tcbw\n"; | |
| 737 break; | |
| 738 case IceType_i16: | |
| 739 assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_edx); | |
| 740 Str << "\tcwd\n"; | |
| 741 break; | |
| 742 case IceType_i32: | |
| 743 assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_edx); | |
| 744 Str << "\tcdq\n"; | |
| 745 break; | |
| 746 } | |
| 728 } | 747 } |
| 729 | 748 |
| 730 void InstX8632Cdq::dump(const Cfg *Func) const { | 749 void InstX8632Cbwdq::dump(const Cfg *Func) const { |
| 731 Ostream &Str = Func->getContext()->getStrDump(); | 750 Ostream &Str = Func->getContext()->getStrDump(); |
| 732 dumpDest(Func); | 751 dumpDest(Func); |
| 733 Str << " = cdq." << getSrc(0)->getType() << " "; | 752 Str << " = cbw/cwd/cdq." << getSrc(0)->getType() << " "; |
| 734 dumpSources(Func); | 753 dumpSources(Func); |
| 735 } | 754 } |
| 736 | 755 |
| 737 void InstX8632Cmov::emit(const Cfg *Func) const { | 756 void InstX8632Cmov::emit(const Cfg *Func) const { |
| 738 Ostream &Str = Func->getContext()->getStrEmit(); | 757 Ostream &Str = Func->getContext()->getStrEmit(); |
| 739 Str << "\t"; | 758 Str << "\t"; |
| 740 assert(Condition != Br_None); | 759 assert(Condition != Br_None); |
| 741 assert(getDest()->hasReg()); | 760 assert(getDest()->hasReg()); |
| 742 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t"; | 761 Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t"; |
| 743 getDest()->emit(Func); | 762 getDest()->emit(Func); |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1467 default: | 1486 default: |
| 1468 Str << "???"; | 1487 Str << "???"; |
| 1469 break; | 1488 break; |
| 1470 } | 1489 } |
| 1471 Str << "("; | 1490 Str << "("; |
| 1472 Var->dump(Func); | 1491 Var->dump(Func); |
| 1473 Str << ")"; | 1492 Str << ")"; |
| 1474 } | 1493 } |
| 1475 | 1494 |
| 1476 } // end of namespace Ice | 1495 } // end of namespace Ice |
| OLD | NEW |