Chromium Code Reviews| Index: src/IceInstMIPS32.cpp |
| diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp |
| index b4c1a871cf229fed2a48a66a80e6e30d8c68d5a3..798fb3f8bd214f6c764ea87dfcb84da7ed5c4a2c 100644 |
| --- a/src/IceInstMIPS32.cpp |
| +++ b/src/IceInstMIPS32.cpp |
| @@ -54,13 +54,22 @@ template <> const char *InstMIPS32Lui::Opcode = "lui"; |
| template <> const char *InstMIPS32La::Opcode = "la"; |
| // Three-addr ops |
| template <> const char *InstMIPS32Add::Opcode = "add"; |
| +template <> const char *InstMIPS32Addu::Opcode = "addu"; |
| template <> const char *InstMIPS32And::Opcode = "and"; |
| template <> const char *InstMIPS32Mul::Opcode = "mul"; |
| template <> const char *InstMIPS32Or::Opcode = "or"; |
| template <> const char *InstMIPS32Ori::Opcode = "ori"; |
| +template <> const char *InstMIPS32Sltu::Opcode = "sltu"; |
| template <> const char *InstMIPS32Sub::Opcode = "sub"; |
| +template <> const char *InstMIPS32Subu::Opcode = "subu"; |
| template <> const char *InstMIPS32Xor::Opcode = "xor"; |
| +InstMIPS32Call::InstMIPS32Call(Cfg *Func, Variable *Dest, Operand *CallTarget) |
| + : InstMIPS32(Func, InstMIPS32::Call, 1, Dest) { |
| + HasSideEffects = true; |
| + addSource(CallTarget); |
| +} |
| + |
| InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src) |
| : InstMIPS32(Func, InstMIPS32::Mov, 2, Dest) { |
| auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest); |
| @@ -145,6 +154,48 @@ void InstMIPS32Ret::emit(const Cfg *Func) const { |
| RA->emit(Func); |
| } |
| +void InstMIPS32Call::emit(const Cfg *Func) const { |
| + if (!BuildDefs::dump()) |
| + return; |
| + Ostream &Str = Func->getContext()->getStrEmit(); |
| + assert(getSrcSize() == 1); |
| + if (llvm::isa<ConstantInteger32>(getCallTarget())) { |
| + // This shouldn't happen (typically have to copy the full 32-bits to a |
| + // register and do an indirect jump). |
| + llvm::report_fatal_error("ARM32Call to ConstantInteger32"); |
|
John
2016/02/01 04:29:32
MIPS32Call
rkotlerimgtec
2016/02/01 21:11:08
Done.
|
| + } else if (const auto *CallTarget = |
| + llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) { |
| + // Calls only have 24-bits, but the linker should insert veneers to extend |
| + // the range if needed. |
| + Str << "\t" |
| + "jal" |
| + "\t"; |
| + CallTarget->emitWithoutPrefix(Func->getTarget()); |
| + } else { |
| + Str << "\t" |
| + "jal" |
| + "\t"; |
| + getCallTarget()->emit(Func); |
| + } |
| +} |
| + |
| +void InstMIPS32Call::emitIAS(const Cfg *Func) const { |
| + (void)Func; |
| + llvm_unreachable("Not yet implemented"); |
| +} |
| + |
| +void InstMIPS32Call::dump(const Cfg *Func) const { |
| + if (!BuildDefs::dump()) |
| + return; |
| + Ostream &Str = Func->getContext()->getStrDump(); |
| + if (getDest()) { |
| + dumpDest(Func); |
| + Str << " = "; |
| + } |
| + Str << "call "; |
| + getCallTarget()->dump(Func); |
| +} |
| + |
| void InstMIPS32Ret::emitIAS(const Cfg *Func) const { |
| (void)Func; |
| llvm_unreachable("Not yet implemented"); |