Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: src/IceInstMIPS32.cpp

Issue 2122043002: Subzero, MIPS32: Extend InstMIPS32Mov to support different data types (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Changes according to comments Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceInstMIPS32.cpp
diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp
index efae86753f22cfaff20b644be1be0640ea180edd..97de8eaec116e387c789730b09a8e141ab18f822 100644
--- a/src/IceInstMIPS32.cpp
+++ b/src/IceInstMIPS32.cpp
@@ -553,29 +553,107 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
Ostream &Str = Func->getContext()->getStrEmit();
Variable *Dest = getDest();
Operand *Src = getSrc(0);
- auto *S = llvm::dyn_cast<Variable>(Src);
- Str << "\t";
- if (Dest->hasReg()) {
- if (S && S->hasReg())
- Str << "move";
- else
- Str << "lw";
- } else {
- if (S && S->hasReg()) {
- Str << "sw"
+ auto *SrcV = llvm::dyn_cast<Variable>(Src);
+
+ assert(!llvm::isa<Constant>(Src));
+
+ const char *ActualOpcode = nullptr;
+ const bool DestIsReg = Dest->hasReg();
+ const bool DestIsMem = !Dest->hasReg();
+ const bool SrcIsReg = (SrcV && SrcV->hasReg());
+ const bool SrcIsMem = !(SrcV && SrcV->hasReg());
+
+ // reg to reg
+ if (DestIsReg && SrcIsReg) {
+ switch (Dest->getType()) {
+ case IceType_f32:
+ ActualOpcode = "mov.s";
+ break;
+ case IceType_f64:
+ ActualOpcode = "mov.d";
+ break;
+ case IceType_i1:
+ case IceType_i8:
+ case IceType_i16:
+ case IceType_i32:
+ Str << "\t"
+ "add"
"\t";
obucinac 2016/07/06 13:41:58 This is done by format tool
- getSrc(0)->emit(Func);
- Str << ", ";
getDest()->emit(Func);
+ Str << ", $zero, ";
+ getSrc(0)->emit(Func);
+ return;
+ default:
+ UnimplementedError(getFlags());
return;
- } else
- Str << "move";
+ }
+
+ assert(ActualOpcode);
+ Str << "\t" << ActualOpcode << "\t";
+ getDest()->emit(Func);
+ Str << ", ";
+ getSrc(0)->emit(Func);
+ return;
}
- Str << "\t";
- getDest()->emit(Func);
- Str << ", ";
- getSrc(0)->emit(Func);
+ // reg to stack
+ if (DestIsMem && SrcIsReg) {
+ switch (Dest->getType()) {
+ case IceType_f32:
+ ActualOpcode = "swc1";
+ break;
+ case IceType_f64:
+ ActualOpcode = "sdc1";
+ break;
+ case IceType_i1:
+ case IceType_i8:
+ case IceType_i16:
+ case IceType_i32:
+ ActualOpcode = "sw";
+ break;
+ default:
+ UnimplementedError(getFlags());
+ return;
+ }
+
+ assert(ActualOpcode);
+ Str << "\t" << ActualOpcode << "\t";
+ getSrc(0)->emit(Func);
+ Str << ", ";
+ getDest()->emit(Func);
+ return;
+ }
+
+ // stack to reg
+ if (DestIsReg && SrcIsMem) {
+ switch (Dest->getType()) {
+ case IceType_f32:
+ ActualOpcode = "lwc1";
+ break;
+ case IceType_f64:
+ ActualOpcode = "ldc1";
+ break;
+ case IceType_i1:
+ case IceType_i8:
+ case IceType_i16:
+ case IceType_i32:
+ ActualOpcode = "lw";
+ break;
+ default:
+ UnimplementedError(getFlags());
+ return;
+ }
+
+ assert(ActualOpcode);
+ Str << "\t" << ActualOpcode << "\t";
+ getDest()->emit(Func);
+ Str << ", ";
+ getSrc(0)->emit(Func);
+ return;
+ }
+
+ // stack to stack
+ llvm::report_fatal_error("mov cant copy stack to stack.");
}
} // end of namespace MIPS32
« no previous file with comments | « no previous file | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698