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

Unified Diff: src/IceInstMIPS32.cpp

Issue 2404803002: [Subzero][MIPS32] Implement bitcast operation for both 32-bit and 64-bit operands (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addressed review comments Created 4 years, 2 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
Index: src/IceInstMIPS32.cpp
diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp
index a508a8a90151560d01352bc73d917ee3e5637562..938d388afd7d27f69006a41a23a0b6981f191adb 100644
--- a/src/IceInstMIPS32.cpp
+++ b/src/IceInstMIPS32.cpp
@@ -283,13 +283,20 @@ InstMIPS32Call::InstMIPS32Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
addSource(CallTarget);
}
-InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src)
+InstMIPS32Mov::InstMIPS32Mov(Cfg *Func, Variable *Dest, Operand *Src,
+ Operand *Src2)
: InstMIPS32(Func, InstMIPS32::Mov, 2, Dest) {
auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest);
auto *Src64 = llvm::dyn_cast<Variable64On32>(Src);
assert(Dest64 == nullptr || Src64 == nullptr);
+ if (Dest->getType() == IceType_f64 && Src2 != nullptr) {
+ addSource(Src);
+ addSource(Src2);
+ return;
+ }
+
if (Dest64 != nullptr) {
// this-> is needed below because there is a parameter named Dest.
this->Dest = Dest64->getLo();
@@ -588,110 +595,7 @@ void InstMIPS32Ret::dump(const Cfg *Func) const {
void InstMIPS32Mov::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
- assert(!(isMultiDest() && isMultiSource()) && "Invalid mov type.");
- if (isMultiDest()) {
- emitMultiDestSingleSource(Func);
- return;
- }
-
- if (isMultiSource()) {
- emitSingleDestMultiSource(Func);
- return;
- }
-
- emitSingleDestSingleSource(Func);
-}
-
-// TODO(jaydeep.patil) Handle all types of operands in mov
-void InstMIPS32Mov::emitIAS(const Cfg *Func) const {
- assert(!(isMultiDest() && isMultiSource()) && "Invalid mov type.");
-
- if (isMultiDest()) {
- llvm_unreachable("Not yet implemented");
- }
- if (isMultiSource()) {
- llvm_unreachable("Not yet implemented");
- }
-
- Variable *Dest = getDest();
- Operand *Src = getSrc(0);
- auto *SrcV = llvm::dyn_cast<Variable>(Src);
- assert(!llvm::isa<Constant>(Src));
- const bool DestIsReg = Dest->hasReg();
- const bool SrcIsReg = (SrcV && SrcV->hasReg());
-
- // reg to reg
- if (DestIsReg && SrcIsReg) {
- auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->move(getDest(), getSrc(0));
- return;
- }
- llvm_unreachable("Not yet implemented");
-}
-
-void InstMIPS32Mov::dump(const Cfg *Func) const {
- if (!BuildDefs::dump())
- return;
- assert(getSrcSize() == 1 || getSrcSize() == 2);
- Ostream &Str = Func->getContext()->getStrDump();
- Variable *Dest = getDest();
- Variable *DestHi = getDestHi();
- Dest->dump(Func);
- if (DestHi) {
- Str << ", ";
- DestHi->dump(Func);
- }
- dumpOpcode(Str, " = mov", getDest()->getType());
- Str << " ";
- dumpSources(Func);
-}
-void InstMIPS32Mov::emitMultiDestSingleSource(const Cfg *Func) const {
- if (!BuildDefs::dump())
- return;
- Ostream &Str = Func->getContext()->getStrEmit();
- Variable *DestLo = getDest();
- Variable *DestHi = getDestHi();
- auto *Src = llvm::cast<Variable>(getSrc(0));
-
- assert(DestHi->hasReg());
- assert(DestLo->hasReg());
- assert(llvm::isa<Variable>(Src) && Src->hasReg());
-
- // Str << "\t"
- // << "vmov" << getPredicate() << "\t";
- DestLo->emit(Func);
- Str << ", ";
- DestHi->emit(Func);
- Str << ", ";
- Src->emit(Func);
-}
-
-void InstMIPS32Mov::emitSingleDestMultiSource(const Cfg *Func) const {
- if (!BuildDefs::dump())
- return;
- Ostream &Str = Func->getContext()->getStrEmit();
- Variable *Dest = getDest();
- auto *SrcLo = llvm::cast<Variable>(getSrc(0));
- auto *SrcHi = llvm::cast<Variable>(getSrc(1));
-
- assert(SrcHi->hasReg());
- assert(SrcLo->hasReg());
- assert(Dest->hasReg());
- assert(getSrcSize() == 2);
-
- // Str << "\t"
- // << "vmov" << getPredicate() << "\t";
- Dest->emit(Func);
- Str << ", ";
- SrcLo->emit(Func);
- Str << ", ";
- SrcHi->emit(Func);
-}
-
-void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
- if (!BuildDefs::dump())
- return;
Ostream &Str = Func->getContext()->getStrEmit();
Variable *Dest = getDest();
Operand *Src = getSrc(0);
@@ -752,6 +656,41 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
llvm::report_fatal_error("Invalid mov instruction. Dest or Src is memory.");
}
+// TODO(jaydeep.patil) Handle all types of operands in mov
+void InstMIPS32Mov::emitIAS(const Cfg *Func) const {
+ Variable *Dest = getDest();
+ Operand *Src = getSrc(0);
+ auto *SrcV = llvm::dyn_cast<Variable>(Src);
+ assert(!llvm::isa<Constant>(Src));
+ const bool DestIsReg = Dest->hasReg();
+ const bool SrcIsReg = (SrcV && SrcV->hasReg());
+
+ // reg to reg
+ if (DestIsReg && SrcIsReg) {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ Asm->move(getDest(), getSrc(0));
+ return;
+ }
+ llvm_unreachable("Not yet implemented");
+}
+
+void InstMIPS32Mov::dump(const Cfg *Func) const {
+ if (!BuildDefs::dump())
+ return;
+ assert(getSrcSize() == 1 || getSrcSize() == 2);
+ Ostream &Str = Func->getContext()->getStrDump();
+ Variable *Dest = getDest();
+ Variable *DestHi = getDestHi();
+ Dest->dump(Func);
+ if (DestHi) {
+ Str << ", ";
+ DestHi->dump(Func);
+ }
+ dumpOpcode(Str, " = mov", getDest()->getType());
+ Str << " ";
+ dumpSources(Func);
+}
+
template <> void InstMIPS32Abs_d::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->abs_d(getDest(), getSrc(0));

Powered by Google App Engine
This is Rietveld 408576698