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

Unified Diff: src/IceInstMIPS32.cpp

Issue 2446273003: [SubZero] Generate relocations for MIPS (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
« no previous file with comments | « src/IceInstMIPS32.h ('k') | src/IceTargetLoweringMIPS32.h » ('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 938d388afd7d27f69006a41a23a0b6981f191adb..8cf559365cf8b5bb340748c14e1d7fcf1185374d 100644
--- a/src/IceInstMIPS32.cpp
+++ b/src/IceInstMIPS32.cpp
@@ -62,6 +62,7 @@ const char *InstMIPS32::getWidthString(Type Ty) {
template <> const char *InstMIPS32Abs_d::Opcode = "abs.d";
template <> const char *InstMIPS32Abs_s::Opcode = "abs.s";
+template <> const char *InstMIPS32Addi::Opcode = "addi";
template <> const char *InstMIPS32Add::Opcode = "add";
template <> const char *InstMIPS32Add_d::Opcode = "add.d";
template <> const char *InstMIPS32Add_s::Opcode = "add.s";
@@ -543,7 +544,7 @@ void InstMIPS32Call::emit(const Cfg *Func) const {
llvm::report_fatal_error("MIPS2Call to ConstantInteger32");
} else if (const auto *CallTarget =
llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) {
- // Calls only have 24-bits, but the linker should insert veneers to extend
+ // Calls only have 26-bits, but the linker should insert veneers to extend
// the range if needed.
Str << "\t"
"jal"
@@ -558,8 +559,14 @@ void InstMIPS32Call::emit(const Cfg *Func) const {
}
void InstMIPS32Call::emitIAS(const Cfg *Func) const {
- (void)Func;
- llvm_unreachable("Not yet implemented");
+ assert(getSrcSize() == 1);
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ if (const auto *CallTarget =
+ llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) {
+ Asm->jal(CallTarget);
+ } else {
+ llvm::report_fatal_error("MIPS32Call: Invalid operand");
+ }
}
void InstMIPS32Call::dump(const Cfg *Func) const {
@@ -656,7 +663,6 @@ void InstMIPS32Mov::emit(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);
@@ -671,7 +677,8 @@ void InstMIPS32Mov::emitIAS(const Cfg *Func) const {
Asm->move(getDest(), getSrc(0));
return;
}
- llvm_unreachable("Not yet implemented");
+
+ llvm::report_fatal_error("InstMIPS32Mov invalid operands");
}
void InstMIPS32Mov::dump(const Cfg *Func) const {
@@ -701,6 +708,11 @@ template <> void InstMIPS32Abs_s::emitIAS(const Cfg *Func) const {
Asm->abs_s(getDest(), getSrc(0));
}
+template <> void InstMIPS32Addi::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ Asm->addi(getDest(), getSrc(0), Imm);
+}
+
template <> void InstMIPS32Add_d::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->add_d(getDest(), getSrc(0), getSrc(1));
@@ -713,7 +725,11 @@ template <> void InstMIPS32Add_s::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Addiu::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->addiu(getDest(), getSrc(0), Imm);
+ if (Reloc == RO_No) {
+ Asm->addiu(getDest(), getSrc(0), Imm);
+ } else {
+ Asm->addiu(getDest(), getSrc(0), getSrc(1), Reloc);
+ }
}
template <> void InstMIPS32Addu::emitIAS(const Cfg *Func) const {
@@ -838,7 +854,7 @@ template <> void InstMIPS32Cvt_s_w::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Div::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->div(getDest(), getSrc(0));
+ Asm->div(getSrc(0), getSrc(1));
}
template <> void InstMIPS32Div_d::emitIAS(const Cfg *Func) const {
@@ -853,14 +869,18 @@ template <> void InstMIPS32Div_s::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Divu::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->divu(getDest(), getSrc(0));
+ Asm->divu(getSrc(0), getSrc(1));
}
template <> void InstMIPS32Lui::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- auto *C32 = llvm::dyn_cast<ConstantInteger32>(getSrc(0));
- uint16_t Imm = static_cast<uint16_t>(C32->getValue());
- Asm->lui(getDest(), Imm);
+ Asm->lui(getDest(), getSrc(0), Reloc);
+}
+
+template <> void InstMIPS32Ldc1::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
+ Asm->ldc1(getDest(), Mem->getBase(), Mem->getOffset(), Reloc);
}
template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const {
@@ -871,6 +891,12 @@ template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const {
Asm->lw(getDest(), Mem->getBase(), Imm);
}
+template <> void InstMIPS32Lwc1::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
+ Asm->lwc1(getDest(), Mem->getBase(), Mem->getOffset(), Reloc);
+}
+
template <> void InstMIPS32Mfc1::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->mfc1(getDest(), getSrc(0));
@@ -961,7 +987,7 @@ template <> void InstMIPS32Mtc1::emit(const Cfg *Func) const {
template <> void InstMIPS32Mtc1::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->mtc1(getDest(), getSrc(0));
+ Asm->mtc1(getSrc(0), getDest());
}
template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const {
@@ -1007,6 +1033,11 @@ template <> void InstMIPS32Mult::emit(const Cfg *Func) const {
emitThreeAddrLoHi(Opcode, this, Func);
}
+template <> void InstMIPS32Mult::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ Asm->mult(getDest(), getSrc(0));
+}
+
template <> void InstMIPS32Multu::emit(const Cfg *Func) const {
if (!BuildDefs::dump())
return;
@@ -1015,7 +1046,7 @@ template <> void InstMIPS32Multu::emit(const Cfg *Func) const {
template <> void InstMIPS32Multu::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
- Asm->multu(getDest(), getSrc(0));
+ Asm->multu(getSrc(0), getSrc(1));
}
template <> void InstMIPS32Nor::emitIAS(const Cfg *Func) const {
@@ -1108,6 +1139,12 @@ template <> void InstMIPS32Subu::emitIAS(const Cfg *Func) const {
Asm->subu(getDest(), getSrc(0), getSrc(1));
}
+template <> void InstMIPS32Sdc1::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
+ Asm->sdc1(getSrc(0), Mem->getBase(), Mem->getOffset(), Reloc);
+}
+
template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(1));
@@ -1116,6 +1153,12 @@ template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const {
Asm->sw(getSrc(0), Mem->getBase(), Imm);
}
+template <> void InstMIPS32Swc1::emitIAS(const Cfg *Func) const {
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0));
+ Asm->swc1(getSrc(0), Mem->getBase(), Mem->getOffset(), Reloc);
+}
+
template <> void InstMIPS32Teq::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->teq(getSrc(0), getSrc(1), getTrapCode());
« no previous file with comments | « src/IceInstMIPS32.h ('k') | src/IceTargetLoweringMIPS32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698