| 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 InstX8632Cbwdq::InstX8632Cbwdq(Cfg *Func, Variable *Dest, Operand *Source) |  | 
|   140     : InstX8632(Func, InstX8632::Cbwdq, 1, Dest) { |  | 
|   141   addSource(Source); |  | 
|   142 } |  | 
|   143  |  | 
|   144 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, |   139 InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source, | 
|   145                              InstX8632::BrCond Condition) |   140                              InstX8632::BrCond Condition) | 
|   146     : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) { |   141     : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) { | 
|   147   // The final result is either the original Dest, or Source, so mark |   142   // The final result is either the original Dest, or Source, so mark | 
|   148   // both as sources. |   143   // both as sources. | 
|   149   addSource(Dest); |   144   addSource(Dest); | 
|   150   addSource(Source); |   145   addSource(Source); | 
|   151 } |   146 } | 
|   152  |   147  | 
|   153 InstX8632Cmpps::InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source, |   148 InstX8632Cmpps::InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source, | 
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   445  |   440  | 
|   446 // In-place ops |   441 // In-place ops | 
|   447 template <> const char *InstX8632Bswap::Opcode = "bswap"; |   442 template <> const char *InstX8632Bswap::Opcode = "bswap"; | 
|   448 template <> const char *InstX8632Neg::Opcode = "neg"; |   443 template <> const char *InstX8632Neg::Opcode = "neg"; | 
|   449 // Unary ops |   444 // Unary ops | 
|   450 template <> const char *InstX8632Bsf::Opcode = "bsf"; |   445 template <> const char *InstX8632Bsf::Opcode = "bsf"; | 
|   451 template <> const char *InstX8632Bsr::Opcode = "bsr"; |   446 template <> const char *InstX8632Bsr::Opcode = "bsr"; | 
|   452 template <> const char *InstX8632Lea::Opcode = "lea"; |   447 template <> const char *InstX8632Lea::Opcode = "lea"; | 
|   453 template <> const char *InstX8632Movd::Opcode = "movd"; |   448 template <> const char *InstX8632Movd::Opcode = "movd"; | 
|   454 template <> const char *InstX8632Sqrtss::Opcode = "sqrtss"; |   449 template <> const char *InstX8632Sqrtss::Opcode = "sqrtss"; | 
 |   450 template <> const char *InstX8632Cbwdq::Opcode = "cbw/cwd/cdq"; | 
|   455 // Binary ops |   451 // Binary ops | 
|   456 template <> const char *InstX8632Add::Opcode = "add"; |   452 template <> const char *InstX8632Add::Opcode = "add"; | 
|   457 template <> const char *InstX8632Addps::Opcode = "addps"; |   453 template <> const char *InstX8632Addps::Opcode = "addps"; | 
|   458 template <> const char *InstX8632Adc::Opcode = "adc"; |   454 template <> const char *InstX8632Adc::Opcode = "adc"; | 
|   459 template <> const char *InstX8632Addss::Opcode = "addss"; |   455 template <> const char *InstX8632Addss::Opcode = "addss"; | 
|   460 template <> const char *InstX8632Padd::Opcode = "padd"; |   456 template <> const char *InstX8632Padd::Opcode = "padd"; | 
|   461 template <> const char *InstX8632Sub::Opcode = "sub"; |   457 template <> const char *InstX8632Sub::Opcode = "sub"; | 
|   462 template <> const char *InstX8632Subps::Opcode = "subps"; |   458 template <> const char *InstX8632Subps::Opcode = "subps"; | 
|   463 template <> const char *InstX8632Subss::Opcode = "subss"; |   459 template <> const char *InstX8632Subss::Opcode = "subss"; | 
|   464 template <> const char *InstX8632Sbb::Opcode = "sbb"; |   460 template <> const char *InstX8632Sbb::Opcode = "sbb"; | 
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   640     Str << ", "; |   636     Str << ", "; | 
|   641     getSrc(0)->emit(Func); |   637     getSrc(0)->emit(Func); | 
|   642     Str << ", "; |   638     Str << ", "; | 
|   643     getSrc(1)->emit(Func); |   639     getSrc(1)->emit(Func); | 
|   644     Str << "\n"; |   640     Str << "\n"; | 
|   645   } else { |   641   } else { | 
|   646     emitTwoAddress("imul", this, Func); |   642     emitTwoAddress("imul", this, Func); | 
|   647   } |   643   } | 
|   648 } |   644 } | 
|   649  |   645  | 
 |   646 template <> void InstX8632Cbwdq::emit(const Cfg *Func) const { | 
 |   647   Ostream &Str = Func->getContext()->getStrEmit(); | 
 |   648   assert(getSrcSize() == 1); | 
 |   649   Operand *Src0 = getSrc(0); | 
 |   650   assert(llvm::isa<Variable>(Src0)); | 
 |   651   assert(llvm::cast<Variable>(Src0)->getRegNum() == TargetX8632::Reg_eax); | 
 |   652   switch (Src0->getType()) { | 
 |   653   default: | 
 |   654     llvm_unreachable("unexpected source type!"); | 
 |   655     break; | 
 |   656   case IceType_i8: | 
 |   657     assert(getDest()->getRegNum() == TargetX8632::Reg_eax); | 
 |   658     Str << "\tcbw\n"; | 
 |   659     break; | 
 |   660   case IceType_i16: | 
 |   661     assert(getDest()->getRegNum() == TargetX8632::Reg_edx); | 
 |   662     Str << "\tcwd\n"; | 
 |   663     break; | 
 |   664   case IceType_i32: | 
 |   665     assert(getDest()->getRegNum() == TargetX8632::Reg_edx); | 
 |   666     Str << "\tcdq\n"; | 
 |   667     break; | 
 |   668   } | 
 |   669 } | 
 |   670  | 
|   650 void InstX8632Mul::emit(const Cfg *Func) const { |   671 void InstX8632Mul::emit(const Cfg *Func) const { | 
|   651   Ostream &Str = Func->getContext()->getStrEmit(); |   672   Ostream &Str = Func->getContext()->getStrEmit(); | 
|   652   assert(getSrcSize() == 2); |   673   assert(getSrcSize() == 2); | 
|   653   assert(llvm::isa<Variable>(getSrc(0))); |   674   assert(llvm::isa<Variable>(getSrc(0))); | 
|   654   assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == |   675   assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == | 
|   655          TargetX8632::Reg_eax); |   676          TargetX8632::Reg_eax); | 
|   656   assert(getDest()->getRegNum() == TargetX8632::Reg_eax); // TODO: allow edx? |   677   assert(getDest()->getRegNum() == TargetX8632::Reg_eax); // TODO: allow edx? | 
|   657   Str << "\tmul\t"; |   678   Str << "\tmul\t"; | 
|   658   getSrc(1)->emit(Func); |   679   getSrc(1)->emit(Func); | 
|   659   Str << "\n"; |   680   Str << "\n"; | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   711   Str << "\n"; |   732   Str << "\n"; | 
|   712 } |   733 } | 
|   713  |   734  | 
|   714 void InstX8632Shrd::dump(const Cfg *Func) const { |   735 void InstX8632Shrd::dump(const Cfg *Func) const { | 
|   715   Ostream &Str = Func->getContext()->getStrDump(); |   736   Ostream &Str = Func->getContext()->getStrDump(); | 
|   716   dumpDest(Func); |   737   dumpDest(Func); | 
|   717   Str << " = shrd." << getDest()->getType() << " "; |   738   Str << " = shrd." << getDest()->getType() << " "; | 
|   718   dumpSources(Func); |   739   dumpSources(Func); | 
|   719 } |   740 } | 
|   720  |   741  | 
|   721 void InstX8632Cbwdq::emit(const Cfg *Func) const { |  | 
|   722   Ostream &Str = Func->getContext()->getStrEmit(); |  | 
|   723   assert(getSrcSize() == 1); |  | 
|   724   Operand *Src0 = getSrc(0); |  | 
|   725   assert(llvm::isa<Variable>(Src0)); |  | 
|   726   assert(llvm::cast<Variable>(Src0)->getRegNum() == TargetX8632::Reg_eax); |  | 
|   727   switch (Src0->getType()) { |  | 
|   728   default: |  | 
|   729     llvm_unreachable("unexpected source type!"); |  | 
|   730     break; |  | 
|   731   case IceType_i8: |  | 
|   732     assert(getDest()->getRegNum() == TargetX8632::Reg_eax); |  | 
|   733     Str << "\tcbw\n"; |  | 
|   734     break; |  | 
|   735   case IceType_i16: |  | 
|   736     assert(getDest()->getRegNum() == TargetX8632::Reg_edx); |  | 
|   737     Str << "\tcwd\n"; |  | 
|   738     break; |  | 
|   739   case IceType_i32: |  | 
|   740     assert(getDest()->getRegNum() == TargetX8632::Reg_edx); |  | 
|   741     Str << "\tcdq\n"; |  | 
|   742     break; |  | 
|   743   } |  | 
|   744 } |  | 
|   745  |  | 
|   746 void InstX8632Cbwdq::dump(const Cfg *Func) const { |  | 
|   747   Ostream &Str = Func->getContext()->getStrDump(); |  | 
|   748   dumpDest(Func); |  | 
|   749   Str << " = cbw/cwd/cdq." << getSrc(0)->getType() << " "; |  | 
|   750   dumpSources(Func); |  | 
|   751 } |  | 
|   752  |  | 
|   753 void InstX8632Cmov::emit(const Cfg *Func) const { |   742 void InstX8632Cmov::emit(const Cfg *Func) const { | 
|   754   Ostream &Str = Func->getContext()->getStrEmit(); |   743   Ostream &Str = Func->getContext()->getStrEmit(); | 
|   755   Str << "\t"; |   744   Str << "\t"; | 
|   756   assert(Condition != Br_None); |   745   assert(Condition != Br_None); | 
|   757   assert(getDest()->hasReg()); |   746   assert(getDest()->hasReg()); | 
|   758   Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t"; |   747   Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t"; | 
|   759   getDest()->emit(Func); |   748   getDest()->emit(Func); | 
|   760   Str << ", "; |   749   Str << ", "; | 
|   761   getSrc(1)->emit(Func); |   750   getSrc(1)->emit(Func); | 
|   762   Str << "\n"; |   751   Str << "\n"; | 
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1483   default: |  1472   default: | 
|  1484     Str << "???"; |  1473     Str << "???"; | 
|  1485     break; |  1474     break; | 
|  1486   } |  1475   } | 
|  1487   Str << "("; |  1476   Str << "("; | 
|  1488   Var->dump(Func); |  1477   Var->dump(Func); | 
|  1489   Str << ")"; |  1478   Str << ")"; | 
|  1490 } |  1479 } | 
|  1491  |  1480  | 
|  1492 } // end of namespace Ice |  1481 } // end of namespace Ice | 
| OLD | NEW |